Pandas 第5講:Python資料處理套件Pandas整理資料欄位與型別

Open Data:

Google Play Store Apps

在前一篇文章中我們介紹了如何將資料進行分組以及利用特定條件篩選所需資料,這些技術都是檢視資料的範疇,接下來我們將進入資料清理的環節,畢竟在正常情況下,我們所得到的資料並非都非常完美,可能會因為收集方便或是人為疏失造成資料的儲存形式較不利於分析的情況,這時候我們就需要將資料先行整理成容易分析的結構或是型別,降低分析的時間成本,這也是資料清理的價值。

  • 使用資料表

Notebook Content:

這次我們會使用google play store(‘googleplaystore.csv’)的公開資料,其中紀錄了google play平台商店中所有app的分類、評分、下載量、名稱、大小⋯⋯等相關資料,假設我們是一間app開發公司的分析人員,我們想研究目前市場中哪些分類的評分以及下載量是比較高的。

因為是使用新資料,所以我們先利用 pd.read_csv() 讀取並顯示前五筆資料:

import pandas as pd
google = pd.read_csv('googleplaystore.csv')
print(google.head());

從下方結果可以發現,google的資料跟先前使用的app資料有些不同,像是欄位名稱的寫法,還有紀錄的內容分類也有些許的不同:

                                                 
                                                 App        Category  Rating  
0     Photo Editor & Candy Camera & Grid & ScrapBook  ART_AND_DESIGN     4.1   
1                                Coloring book moana  ART_AND_DESIGN     3.9   
2  U Launcher Lite – FREE Live Cool Themes, Hide ...  ART_AND_DESIGN     4.7   
3                              Sketch - Draw & Paint  ART_AND_DESIGN     4.5   
4              Pixel Draw - Number Art Coloring Book  ART_AND_DESIGN     4.3   

  Reviews    Size     Installs    Type   Price   Content Rating  
0     159     19M      10,000+    Free       0         Everyone   
1     967     14M     500,000+    Free       0         Everyone   
2   87510    8.7M   5,000,000+    Free       0         Everyone   
3  215644     25M  50,000,000+    Free       0             Teen   
4     967    2.8M     100,000+    Free       0         Everyone   

                      Genres      Last Updated         Current Ver  
0               Art & Design   January 7, 2018               1.0.0   
1  Art & Design;Pretend Play  January 15, 2018               2.0.0   
2               Art & Design    August 1, 2018               1.2.4   
3               Art & Design      June 8, 2018  Varies with device   
4    Art & Design;Creativity     June 20, 2018                 1.1   

    Android Ver  
0  4.0.3 and up  
1  4.0.3 and up  
2  4.0.3 and up  
3    4.2 and up  
4    4.4 and up

df.rename() 修改欄位命名 (官方document):


首先我們先從欄位名稱開始,在欄位名稱的使用上比較常見的寫法有兩種,分別Camel Case Snake Case 兩種,這兩種寫法在程式語言的命名規則中很常見。這邊我們只針對 Snake Case 做說明,想了解 Camel Case 可以點擊上面的連結,Snake Case 的規則是:

  • 全部字母為小寫
  • 如果有兩個以上的字母,使用「 _ 」符號做串連
  • Ex. snake_case
  • 特性:辨識度高,且選取操作的效率好

而在進行資料處理時,因為很常使用到欄位名稱去定位資料,所以欄位名稱的寫法會有很大程度的影響我們操作上的效率,舉例來說像是「snake case」與「snake_case」兩者雖然只有空格與底線的差別,但當我們要選取複製這兩個欄位名稱時,後者的寫法我們可以透過雙擊直接選取,但前者需要使用游標匡選,方便性就低了些。

在進行資料處理上面,我會比較推薦大家使用 Snake Case ,因為它相較於 Camel Case 有較高的辨識度,不過這方面比較見仁見智,並沒有特別強求,主要自己習慣即可。接下來我們要試著將資料表 google 的欄位名稱改成 Snake Case 模式:

mapping = {
    'Content Rating':'content_rating',
    'Last Updated':'last_updated',
    'Current Ver':'current_ver',
    'Android Ver':'android_ver',
}
google = google.rename(mapping,axis=1);
print(google.columns)

首先我們先利用 dict() 定義了我們要指定哪些欄位以及要將這些欄位名稱改成什麼,字典中的key值就是挑選的欄位,value值則是欲修改成的名稱,完成後我們將這個字典引入 df.rename()方法,並設定參數 axis 1axis=1 代表針對「欄位(columns)」的操作,這個方法也可以修改「索引(index)」的名稱,如果是針對索引的操作,只要設定 axis=0 即可。

這邊我們利用 df.columns 屬性查看欄位修改後的結果,可以看到我們所選的四個欄位名稱已經變成 Snake Case的寫法了:

Index(['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type',
       'Price', 'content_rating', 'Genres', 'last_updated', 'current_ver',
       'android_ver'],
      dtype='object')

df.columns.str.method 直接針對欄位進行字串操作 (官方document):


除了利用 df.rename() 方法之外,也可以直接針對 df.columns 屬性進行字串操作,比如說,剛才我們先將部分有多個單字的欄位改成 Snake Case ,但其他的欄位我們也希望皆為小寫,所以我們直接針對 df.columns 進行操作:

google.columns = google.columns.str.lower()
print(google.columns)

這邊我們使用了一個pandas套件的資料處理技術叫做「vectorized string methods」,這個技術可以讓我們不需要使用迴圈,一次將 Series 中的所有字串進行相同的字串操作,只要在字串操作方法前加上 .str 即可,此方法我們會在之後的文章中提到,然而這個方法也可以運用在 df.columns,所以我們利用.str.lower() 將所有欄位名稱一次改成小寫字母,如下面的結果:

Index(['app', 'category', 'rating', 'reviews', 'size', 'installs', 'type',
       'price', 'content_rating', 'genres', 'last_updated', 'current_ver',
       'android_ver'],
      dtype='object')

在處理完欄位名稱之後,我們要接著縮減資料的大小,因為我們在分析的時候未必會使用到所有的欄位或是每一筆資料,如果是跟研究目標沒有相關的資料,我們會將該欄位進行刪除,以增加資料處理的速度。

df.drop() 資料/欄位刪除 (官方document):


若要進行整行或整欄的資料刪除,只需在 df.drop() 方法中引入索引/欄位名稱,並設定參數 axis 1 0 即可,不過這邊要注意,此方法並不像 list.pop() 會自動存取刪減後的物件,是需要重新賦值的,雖然有些麻煩,但好處是我們可以先看看資料刪減後的樣子是否跟我們預想的一樣,如果和預想相同,再進行賦值,以免誤刪重要的資料。

像針對 google 資料,我們並不會使用到各個軟體的版本更新資料,所以我們將欄位last_updated進行刪除:

google = google.drop('last_updated',axis=1)  #因為是刪除「欄位」,所以設定axis=1
print(google.columns)
Index(['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type',
       'Price', 'content_rating', 'Genres', 'current_ver', 'android_ver'],
      dtype='object')

從上面的 df.columns 輸出結果可以看到,last_updated 已經成功被我們刪除。

然而 df.drop() 方法不只可以刪除欄位,也可以配合「條件篩選」刪除不必要的數筆資料,例如,因為我們是發展免費軟體,所以我們要刪除所有付費軟體的資料,首先我們先篩選「軟體費用不為零」的所有資料:

首先我們先看一下欄位price的資料狀況

print(google['price'].describe())
count     10841  #總共有10841筆資料
unique       93
top           0
freq      10040
Name: price, dtype: object

接著我們篩選條件「價格欄位不為零的資料」作為 mask 並提取所有符合條件資料,然後取得這些資料的索引值,作為 df.drop() 的參數,然後因為是刪除索引,所以設定 axis=0

mask = google['price']!='0'  #建立資料篩選遮罩
pay_app = google.loc[mask]  #利用遮罩篩選資料
google = google.drop(pay_app.index,axis=0)  #將刪除後的資料表重新賦值
print(pay_app['price'].describe())  #確認有多少筆資料為付費軟體
count       801  #有801筆付費資料
unique       92
top       $0.99
freq        148
Name: price, dtype: object

在進行資料刪除後,我們再次確認價格欄位的資料數:

print(google['price'].describe())

結果顯示,少了801筆資料,跟上面的付費軟體資料數吻合,代表付費軟體資料成功被刪除:

count     10040  #總共有10040筆資料
unique       93
top           0
freq      10040
Name: price, dtype: object

df.dtypes / df.astype() / Series.astype() 改變資料型別 (官方document):


在進行資料處理時常會碰到欄位型別的問題,在Pandas中常見的資料型別主要分為 int(整數), float64(浮點數) , object(字串) 三種,我們可以利用 df.dtypes 顯示所有欄位的資料型別:

print(google.dtypes)
app                object
category           object
rating            float64
reviews            object
size               object
installs           object
type               object
price              object
content_rating     object
genres             object
current_ver        object
android_ver        object
dtype: object

在這些型別中,整數與浮點數欄位都可以進行所有數值的計算,像是當我們使用 df.describe() 方法時,這兩種數值欄位會自動計算平均數、最大值、最小值、標準差……等統計數值;但字串欄位因為沒有數值意義,無法進行運算,所以只會回傳出現最多次的字串、出現次數以及欄位中有幾種不同的值,如下所示:

google['rating'].describe()
count    8719.000000
mean        4.186203
std         0.512338
min         1.000000
25%         4.000000
50%         4.300000
75%         4.500000
max         5.000000
Name: rating, dtype: float64

從上面的結果中可以看到,pandas回傳了「下載率」欄位的各項統計數值。

google['category'].describe()
count      10040
unique        33
top       FAMILY
freq        1781
Name: category, dtype: object

跟浮點數與整數型別不同,object 型別欄位利用 Series.describe() 的回傳結果只會有「資料數」、「獨立值數量」、「出現次數最高的值」、「出現率最高的值的出現次數」。

然而,有些時候我們很常會遇到一種狀況:資料內容為數值內容,但因為存取或是記錄時的問題,導致欄位型別為非數值型別,這個問題可能會導致我們在進行資料處理時遇到一些因型別而無法計算的情況發生,為了避免這件事,我們需要一個方法能夠讓我們進行資料型別的轉換,那就是 df.astype()

其實這個方法跟python原生的函式 type() 使用方式一樣,只要將欲修改的欄位 Series 使用 astype() 並設定要修改為什麼型別即可,操作如下:

我們現在想將各個App的總安裝次數轉換為整數型別,首先我們已經先將欄位欲處理為數字的字串欄位 installs_int 並顯示前五筆資料數值:

print(google['installs_int'].head())
0       10000
1      500000
2     5000000
3    50000000
4      100000
Name: installs_int, dtype: object

從結果可以發現,雖然內容看起來是數值沒有問題,但仔細看下方的 dtype ,這個欄位的型別其實是字串而非整數,所以我們要使用 Series.astype() 將這個欄位的型別轉換為 int (整數):

google['installs_int'] = google['installs_int'].astype(int)
print(google['installs_int'].head())
0       10000
1      500000
2     5000000
3    50000000
4      100000
Name: installs_int, dtype: int64

當我們完成型別轉換之後,再次顯示前五筆資料並檢查 dtype 可以看到,欄位型別已經成功轉換為整數型別,這樣一來就可以進行下一步的計算了!

Written by

Glove Yen

一個不務正業的企管人,喜歡有創造性的事物,從管理到設計到程式,目前正在鑽研資料科學以及網頁前端開發,不知從什麼時候開始已經習慣了每天coding的日子。

—轉自好文作者Glove Yen_Data Science_Python資料處理套件part4 – Pandas 整理資料欄位與型別
如果你喜歡他的文章、Python資料分析有興趣,歡迎回到他的Blog: glove-coding看更多:)

或接續觀看Pandas 第6講:Python資料處理套件Pandas 資料字串處理

📒 Python Pandas 系列文章:

Pandas 第1講:Python資料處理套件Pandas簡介

Pandas 第2講:Python資料處理套件Pandas資料儲存物件

Pandas 第3講:Python資料處理套件Pandas檢視與定位資料

Pandas 第4講:Python資料處理套件Pandas條件篩選資料

Pandas 第5講:Python資料處理套件Pandas整理資料欄位與型別(本文)

Pandas 第6講:Python資料處理套件Pandas 資料字串處理

Pandas 第7講:Python資料處理套件Pandas數值處理與基礎統計量

快樂學程式在Udemy 也推出了以Pandas 套件進行資料處理的實戰課程,這次是將Python已視覺化的方式

對資料進行解析,只要一個假日拉高你的職場競爭力!快來這裡一起快樂學程式!

如果你的入門還在單打獨鬥,歡迎來到快樂學程式找到志同道合的夥伴,你的自學之路不孤單。

學程式助教

Recent Posts

三個你不能錯過的教學資訊

疫情之下,原本實體活動全都改成線上,活動分享全都在網路上很容易錯過,這邊整理了幾個跟數位教學相關的活動資訊給大家參考,分享順序為活動時間⏰ 1. Google Workspace技術整合術 Google Workspace for Education (原 G Suite 教育版) 能透過 Gmail、Google Drive、Google Calender、Google Meet 和 Classroom 等通訊與協作應用程式創造輕鬆與順暢的學習環境,並促進協同合作以提升數位學習與教學成效,而且還會為學校資料提供雲端安全性防護…

3 years ago

線上教學沒有臨場感?Gather來幫你解決

實體的教室變成一格一格的畫面,原本吵雜的下課時間也變成掛斷通話的系統聲。原本在班級中的歸屬感慢慢消失了,久而久之,孩子的對於學習,不再有群體的感覺,只是孤軍一人學習、複習、考試,甚至是畢業典禮都少了一份臨場感。因此,今天要和大家介紹一款現在在教育界還很少被提到的軟體-Gather。 Gather 如果你還不知道Gather,或是直覺的把Gather與虛擬會議室連結在一起,不妨先看看Gather裡的特色: 介面是像素型RPG 每個人自由創建一個角色 上下左右輕易控制角色 走道其他角色旁邊能互相討論 小遊戲battle 光是這五點特色,就足以推派它成為遠距教學的工具,除了打造不同空間的地圖外,最特別的是Gahter打造前所未有的臨場感,人與人之間只有靠近到一定距離,才能聽到彼此說話聲音,而相對應的,離開後聲音就會漸漸聽不到,就連白噪音的設計也是如此,非常的逼真。 不知道老師們會不會因為搭建地圖覺得麻煩,或是看到2D介面怕學生當遊戲在玩而不考慮這款軟體,換個角度思考,藉由不同地區的老師們集思廣益,打造出最適合學生學習的環境,像是不同學科的教室、戶外自然生態區、操場、籃球場等等....都可以更貼近真實校園,而像素的介面正好提高學生的學習意願,老師們擔心學生過於沉迷時,也能用全體廣播放上課鐘聲,或是讓學生們聚集在同一區,鏡頭站起來動一動 (另外推薦Active Arcade -> 趣味運動的APP ),就像早操一樣很真實。 線上教學缺乏臨場感,Gather可以創造了讓大家「一起在一個遊戲世界」的凝聚力。縱使Google Meet、Teams 雖然也可以進行討論,但若要每堂課要穿梭在不同會議間,節奏不流暢,使用Gather可以讓學生更自由地移動,相對應的老師也可以神出鬼沒地到處「旁聽」。 教孩子用科技解決問題,如果老師們也努力著示範給孩子看,創造出獨一無二的學習空間,相信對於孩子學習的歷程中,有莫大收穫。但到底怎麼開始使用?別擔心,這次快樂學程式邀請到Gahter界的大神 阿岳,要來和大家分享Gather的6大應用技巧,限名額唷~…

3 years ago

HTML入門系列:基本觀念介紹!

HTML入門&基本觀念介紹!         構成一個網頁,最重要的就是他的結構,而HTML就像是他的骨架,而CSS就是像是我們身體上的肌肉一般,而JS則像是人體的神經、血管般調整著我們身體、傳遞訊息,那麼HTML究竟是指哪些語法呢?   什麼是HTML?       HTML全文又稱為HyperText Markup language ,也就是所謂的超文本標記語言,是網頁構成的基本要素,換言之,網頁就是由一堆html所構成,透過瀏覽器,顯示文字、圖片、以及其他相關我們可以在網頁上看見的基本元素。而對於剛學程式的朋友來說,HTML有以下幾個重點: HTML的基本架構: HTML的基本觀念與優點1.容易學習-HTML的文檔製作非常簡單易懂﹐功能強大之餘還支持不同格式的文件鑲入。2.製作門檻低-HTML是文本﹐它需要瀏覽器的解釋。只要你學會了HTML﹐你就可以直接在Windows的記事本或寫字版上進行製作和編輯﹐當然你也可以用WPS來編寫﹐只要注意在存檔的時候用.htm或.html來做檔名就可以了3.有利於搜尋引擎理解你的內容,透過HTML所構成的頁面被稱作所謂的”靜態頁面”﹐而Google爬蟲會優先收錄靜態網頁﹐所以HTML對於Google來說就像是鯊魚聞到血腥味一樣﹐有利於吸引Google爬蟲。4.加快瀏覽速度-因為靜態網頁無需連接數據庫﹐因此比打開動態網頁的速度較快﹐對於消費者體驗來說有所幫助。5.網站更安全-因為HTML頁面不會受Asp相關漏洞所影響。 HTML的缺點與限制 1.太簡單﹐不能適應現在越來越發達的網路世界和應用的需要﹐比如手機﹑PDA﹑信息家電等都不能直接顯示HTML2.太龐大﹐由於HTML代碼不規范﹑臃腫﹐瀏覽器需要足夠智能和龐大才能夠正確顯示HTML。顯然在你的PDA上裝一個IE6是不可能的。空間不夠﹐運算也跟不上3.數據與表現混雜。這樣你的頁面要改變顯示﹐就必須重新制作HTML。對不同的網路設備顯示同樣的數據都需要制作不同的HTML4.只能對文本進行排版﹐而且HTML樣式使用標準文本標識﹐不能創建一些特殊效果 所以我該如何學習HTML? 有什麼比較快的方法嗎?       答案是沒有的﹐學習程式語言就像是學習廚藝一樣﹐只有透過不停的嘗試﹑嘗試和嘗試才能讓自己有所成長﹐並且慢慢強大。過程中你會一直遇上困難和失敗﹐但你在不斷解決困難的過程中能夠不斷發掘新的知識﹐從失敗中發才能不停的成長。無論你是學習那一種程式語言﹐都需要經歷困難和失敗才能讓自己更加強大﹐正所謂:不經一番寒徹骨,怎得梅花撲鼻香呢?對吧﹐我們能做的不是要找捷徑﹐而是透過不同的媒介和平台去不斷學習﹐那麼下面快樂學程式會為大家介紹一些很棒的程式教學網站﹐讓大家可以不斷提升自己。 1.w3schools.com- 語法練習的好地方這個網站是目前全球訪問量最大的網頁開發教程網站﹐網站裡有多種程式語言的教學﹐而且每種程式語言由淺到深的解說﹐從語言的介紹到不同的功能和方法都會分章節說明。所以無論你是從零開始學的白紙﹐還是已經在學習但遇到困難的新手都可以在這個網站上找到相關資訊﹐是個非常不錯的網站。那麼網址我們當然要雙手奉上﹐請慢用https://www.w3schools.com/ 2.CodeAcademy- 免費的教學網站這是全球其中一個最受歡迎的免費coding教學網站﹐已經有超過2400萬人透過這個網站學習到了如何去coding。這個網站是非常適合新手入門的同學去學習的﹐網站會一步一步仔細的教導而且還有實作﹐所以學習起來非常的快速! 3.StackOverflow- 實際案例與疑難雜症的解決處  這個網站比較適合一些已經有在嘗試動手實作的同學﹐當你在coding的時候遇上困難了﹐那麼你可以在這個可以解決超過80種程式語言問題的網站上找到答案﹐讓你的coding之路更加順暢。  如果你覺得爬網站麻煩又費時,不妨直接點擊快樂學程式的網頁前端課程,老師直接手把手帶你入門HTML !完整的基礎入門課程省下你獨自摸索花費的時間!   課程上架Udemy ! 準備一個輕鬆的週末,只要一天的時間,帶你建置靜態網頁。從實作中打開靜態網頁的大門,讓你的研究之路不是只有自己,有我們跟你一起努力!課程中你可以瞭解網站建置的世界觀與網站版型掌握HTML5的使用方式掌握 CSS3的使用方式使用Bootstrap處理前端UI框架現在開始上課!如果你的入門還在單打獨鬥,歡迎來到快樂學程式找到志同道合的夥伴,你的自學之路不孤單。快樂學程式

3 years ago

HTML語法整理! 3分鐘快速弄懂常用語法!

什麼是HTML?         HTML全名是HyperText Markup Language,是一種描述超文件的註記語言SGML(Standard Generalized Markup Language)所制訂出的一種網頁語言,是編寫網頁的基本語言,基本上現行的瀏覽器都可以讀取HTML,使用HTML可以編輯設計出網頁,也可以在網頁中加入所有HTML語言可支援的方式,例如表格、表單、圖片、文字、連結、程式等等。 HTML介紹與基本語法整理   不管你是小時候從撰寫無名小站為了要修改你的樣式,而開始瞭解HTML和CSS為何物,或是長大因為介面設計或前端工程開始踏入網頁的世界。HTML和CSS對於網站的重要性經過多年依然歷久不衰。在本篇會對HTML進行基礎的介紹並幫你整理出基本語法提供你在寫網頁時的快速參考!   編寫基本的HTML: 先讓大家看一下一個基本的HTML文件格式為: <HTML> <HEAD> <TITLE>網頁主題</TITLE> <Meta> </HEAD> <BODY>…

3 years ago

PHP是什麼?3分鐘PHP基本介紹!

PHP是什麼?3分鐘PHP基本介紹!       大家安安﹐快樂學程式這一次要跟大家分享PHP這種程式語言。希望幫助對於PHP有興趣的新手們可以透過我們的文章對這種語言有初步認識。一如以往﹐我們會分享以下幾項有關PHP的知識。 PHP是什麼?       PHP語言的全名是(PHP: Hypertext Preprocessor),和ASP、JSP等都是動態網頁開發語言,不過,PHP擁有跨平台的能力,無論是在Linux(最適合)、Unix、 Windows都可以執行運作,不像微軟 的ASP只能在Windows平台上執行,而且PHP是免費的,並可結合多種資料庫伺服器,如:MySQL、PostgreSQL、dBase、mSQL、Informix、ODBC、Oracle等。      PHP語言是伺服器端(Server)執行的網頁,不像一般HTML網頁,只要單機下開啟檔案就可以檢視網頁,PHP必須先在伺服器端執行完後,再將結果傳至使用者端(Client)的瀏覽器中檢視結果,所以必須使用網站伺 服器,且伺服器要支援PHP。 如何學好PHP?       要學好PHP,要有目的,要有一個想寫的東西,寫個學校網站,寫個校友系統,寫個簡單的新聞區或相簿...等,都可以,盡可能的和工作和生活結合,利用程式來簡化繁瑣的人工步驟,或者提昇工作效率,有目標,才會有動力,才會有想法。      學PHP不需要背,背不完的,只要懂就好了。像函數就不用背,常用的打久了你就背起來了,不常用的,等到要用時,知道去哪裡找就好。換言之,函數懂越多,功力越高強。      程式碼可以複製貼上,但一定要知道為什麼要這麼寫,不要傻傻的照著打,可以的話,自己打一遍最好,最上乘就是可以說出每一行程式碼的作用和前因後果。或者,故意打錯,看看會怎樣。錯誤訊息看久了,功力也就提昇了。 PHP程式碼執行方式 透過 Web Server 方式:例如利用 Apache…

3 years ago

PHP是什麼?基本介紹與語法整理

Sildenafil citrate oral jelly Combiné avec les données de départs 2, on leur a demandé de type 5 de tadalafil…

3 years ago