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

Open Data:

Mobile App Statistics (Apple iOS app store)

上一篇文章中,我們介紹了如何檢視與定位資料,並且在文章最後提到「我們在提取 index 的時候,較常使用 mask 進行條件篩選」,這個條件篩選的方法是 pandas 套件中非常重要的功能,也是這篇文章的核心重點。

  • 使用資料表

Notebook Content:

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

資料條選件篩選:


首先我們先試著從資料中提取 price 欄位的前20筆資料,看一下app的價格有哪些:

print(app['price'].head(20))
0     0.00
1     0.00
2     0.00
3     0.00
4     0.00
5     0.00
6     0.00
7     0.00
8     0.00
9     0.00
10    0.00
11    1.99
12    0.00
13    0.00
14    0.00
15    0.00
16    0.00
17    0.99
18    6.99
19    0.00
Name: price, dtype: float64

從前20筆app的價格中可以看到,大部分app是免費的,而有些則需要1.99美金與6.99美金,當然這只是前20筆資料,在所有app中可能有非常多種的價格,但假設我們的app公司要開發的軟體是免費的,所以我們在分析的時候只需要使用到價格為0.0的app資料

在Python中有所謂的「比較運算子」也就是 == , != , > , < , >= , <= 這些,在進行兩數值比較時會依據「比較結果是否符合運算條件」回傳 TrueFalse 兩種布林值。其實在 pandas 套件也存在比較運算子的機制,只需要使用 Series比較運算子比較值 的格式,pandas會將Series 中的每一個值與比較值進行比較運算,並回傳布林值作為新的 Series ,所以我們現在就利用比較運算的方式比較price 欄位的每個軟體價格是否為免費吧!

print(app['price']==0)
0        True
1        True
2        True
3        True
4        True
5        True
6        True
7        True
8        True
9        True
10       True
11      False
12       True
13       True
14       True
15       True
16       True
17      False
18      False
19       True

因為篇幅問題所以我們只顯示前20筆結果,你可以跟上面的 Series 比較一下,如果上面的資料為 0.0 那這邊的同一個 index 結果應為 True ,反之則為 False

接著我們要繼續利用這個布林值的 Series ,首先我們先將這個 Series 賦値為變數 mask ,並將他放進 df.loc[,] 中,然後將 mask 放在 index 的位置,然後我們提取 price 欄位,並顯示前20筆結果:

mask = app['price'] == 0
print(app.loc[mask,'price'].head(20))
0     0.0
1     0.0
2     0.0
3     0.0
4     0.0
5     0.0
6     0.0
7     0.0
8     0.0
9     0.0
10    0.0
12    0.0
13    0.0
14    0.0
15    0.0
16    0.0
19    0.0
20    0.0
21    0.0
22    0.0
Name: price, dtype: float64

從結果可以看到,同樣是欄位 price ,但全部20筆的資料都變成了 0.0 ,而且左邊的 index 也有些不同:少了11,17,18號資料,這就是最基本的條件篩選方法,利用比較運算回傳的布林值 Series 作為mask(遮罩),選取符合條件(True)的所有資料,下圖是我們篩選資料的示意圖,你可以把這次的操作理解為「選取符合條件(mask)的 price 欄位資料」。

然而在進行資料篩選時,是可以有多個條件的,也就是Python的 andor ,不過在 pandas 套件中是我們是使用 &| 的符號表示。假設我們現在想篩選「免費」而且是「遊戲分類」的軟體,所以我們就必須設定條件:「 price 欄位為 0.0 prime_genre 欄位為 “Games” 」的所有資料,我們先分別看一下這兩個條件的結果:

條件一:價格為免費

print(app['price']==0)

條件二:分類為遊戲

app['prime_genre']=='Games'

結果一:

11      False
12       True
13       True
14       True
15       True
16       True
17      False
18      False
19       True
20       True
......

結果二:

11       True
12       True
13       True
14       True
15       True
16       True
17       True
18       True
19       True
20      False
......

因為篇幅問題我們只顯示其中幾筆資料結果,從上面的兩個布林值結果可以看到,結果一有7筆資料符合條件(True),結果二則有9筆資料符合,這時候我們使用 & 把兩個條件串起來試試:

ps.記得在使用 & | 的時候,兩邊的條件需要使用小括號包起來,否則會出現 error !

print((app['price']==0) & (app['prime_genre']=='Games'))
11      False
12       True
13       True
14       True
15       True
16       True
17      False
18      False
19       True
20      False
......

上面為兩個條件的篩選結果,因為是使用 & (且)所以當兩邊結果都是 True 時,合併的結果才會顯示 True ,像是第20號資料雖然價格是免費,但是他並非遊戲分類,所以最後的合併結果為 False ,如果我們改成使用 | (或)的話,結果如下:

print((app['price']==0) | (app['prime_genre']=='Games'))
11       True
12       True
13       True
14       True
15       True
16       True
17       True
18       True
19       True
20       True
......

因為兩邊的條件都至少有一邊符合,所以這邊的10筆資料結果全部都是 True

現在我們試著將這個篩選結果的布林值 Series 作為遮罩(mask),放進df.loc[,] 進行資料定位,這邊我們只提取「名稱」、「價格」、「分類」三個欄位:

mask = (app['price']==0) & (app['prime_genre']=='Games')  #篩選條件
cols = ['track_name','price','prime_genre']  #提取名稱、價格、分類欄位
print(app.loc[mask,cols].head(10))
                             track_name  price   prime_genre
2                        Clash of Clans    0.0         Games
3                            Temple Run    0.0         Games
7                      Candy Crush Saga    0.0         Games
9                           Angry Birds    0.0         Games
10                       Subway Surfers    0.0         Games
12                            Solitaire    0.0         Games
13                           CSR Racing    0.0         Games
14  Crossy Road - Endless Arcade Hopper    0.0         Games
15             Injustice: Gods Among Us    0.0         Games
16                              Hay Day    0.0         Games

從結果可以看到我們成功篩選了「免費的遊戲軟體」,在這次使用的程式碼中有個需要注意的地方,就是易讀性的問題,雖然我們可以把所有的條件與提取欄位都寫在 df.loc[,] 中,但是這樣會得到一串非常長的程式碼,其實會大大降低我們程式碼的易讀性。我們在進行資料分析的時候常常是一個團隊一起執行,這時候程式碼的易讀性就顯得非常重要,所以我們應該要養成好習慣,過長的程式碼可以另外賦值為變數,並適時寫一些註解,幫助團隊可以更快理解這段程式碼。

df.groupby() 資料分組


除了直接使用條件篩選資料以外,我們也可以使用「分組」的方式篩選資料,這種方法是利用單一欄位將資料進行分組,比如說 prime_genre 欄位中有所有的軟體分類,這時候我們想看看不同分類的軟體平均價格,這時候就很適合使用 df.groupby() 方法,此方法的使用方式非常的簡單,只要在方法中引入你想要作為分組依據的欄位名稱即可,像是現在我們想分組所有的分類:

groups = app.groupby('prime_genre')
print(groups)

這時我們發現一件事,分組之後,pandas回傳了一個新的物件 groupby

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x11af94780>

基本上我們無法直接使用 groupby 物件,需要額外的方法才可以使用,那就是利用方法groupby.get_group() 直接取出整組資料。

groupby.groups 各組的資料index值


我們現在已經將資料依照 prime_genre 欄位中的不同類別進行分組,但我們剛才直接將結果印出來,卻得到了一個新的 groupby 物件,這邊要解釋一下,groupby 物件記錄了每一個分類組別中的所有資料的 index 值,這點我們可以利用他的一個 groups 屬性驗證:

groups = app.groupby('prime_genre')
print(groups.groups)

利用這個屬性我們可以看到,這個屬性是一個 dict() 裡面每一個key值都是一個分類,每一個分類都有一個相對應的陣列,陣列中的數字就是這個分類資料的 index 值,例如:「書」的分類軟體有第77,208,244,285…..號資料,而「商用」的軟體有第419, 489, 513, 529, 584, 682…號資料,以此類推:

{'Book': Int64Index([ 77, 208, 244, 285, 364, 1270, 1996, 2186, 2203, 2481,
            ..., 7080, 133, 7137, 7145, 7153, 7159, 7167, 7171, 7188, 7193],
            dtype='int64', length=112),
'Business': Int64Index([ 419,  489,  513,  529,  584,  682,  934, 1092, 1098, 1119, 1149,
            1222, 1286, 1343, 1679, 1680, 1709, 1757, 1764, 1977, 2055, 2143,
            2335, 2394, 2479, 2487, 2564, 2666, 2685, 2701, 2702, 2710, 2767,
            3208, 3370, 3392, 3541, 3909, 3939, 4054, 4098, 4171, 4495, 5020,
            5168, 5172, 5192, 5209, 5805, 5808, 5922, 5974, 5988, 6428, 6441,
            6650, 7025],
            dtype='int64'),
'Catalogs': Int64Index([ 862, 2028, 2387, 3276, 3891, 6374, 6418, 6464, 6674, 6881],
            dtype='int64'),
'Education': Int64Index([ 122, 169, 227, 311, 373, 446, 610, 672, 674, 685,
            ..., 7081, 7087, 7097, 7107, 7110, 7129, 7148, 7150, 7157, 7190],
            dtype='int64', length=453),
'Entertainment': Int64Index([ 55, 61, 78, 99, 104, 114, 177, 193, 215, 221,
            ......]}

groupby.get_group(group_value) 提取組資料方法


不過光是知道有哪些編號似乎無法做什麼,必須要能顯示整組資料才行,所以我們要使用方法 group.get_group() ,這個方法只要在括弧中引入我們要顯示的分類即可,像下面的程式碼:

print(group.get_group('Book').head())  #因為df.head()本身預設為顯示前五筆資料,所以我們就不特別設定

結果他回傳了第77,208,244,285,364號資料,這剛好就是上面 dict 中key值為 ‘Book’ 的陣列中的前五個號碼且仔細看他們的 prime_genre 欄位值都是 Book

             id                                         track_name  
77    302584613        Kindle – Read eBooks, Magazines & Textbooks   
208   379693831  Audible – audio books, original series & podcasts   
244  1031002863       Color Therapy Adult Coloring Book for Adults   
285   366869252          OverDrive – Library eBooks and Audiobooks   
364  1024818709                              HOOKED - Chat Stories   

     size_bytes currency  price  rating_count_tot  rating_count_ver  
77    169747456      USD    0.0            252076                80   
208    81558528      USD    0.0            105274              1774   
244   135236608      USD    0.0             84062              1450   
285    39844864      USD    0.0             65450              2721   
364    94545920      USD    0.0             47829               708   

     user_rating  user_rating_ver     ver cont_rating prime_genre  
77           3.5              4.5    5.11          4+        Book   
208          4.5              4.5    2.23          4+        Book   
244          5.0              4.5     2.0          4+        Book   
285          4.0              4.5   3.6.4          4+        Book   
364          4.5              4.5  2.28.0          9+        Book   

     sup_devices.num  ipadSc_urls.num  lang.num  vpp_lic  
77                37                5         9        1  
208               37                5         5        1  
244               37                4         2        1  
285               37                5        18        1  
364               37                0         8        1

從結果的格式你應該能夠看得除來,groups.get_group() 方法會回傳 DataFrame 物件,所以我們能在取得分組資料後繼續使用 df 的方法進行資料處理,比如說欄位提取、查看空值、資料清理……等,這就是這個方法方便的地方。

我們到現在已經學會了讀取資料、檢視資料、定位部份資料與如何將資料進行分組等方法,下一篇我們要開始進入資料清理的範圍,這是資料科學中非常重要的一環,好的資料清理可以增加後續的分析與視覺化的效率,也能夠讓我們在清理的過程中更熟悉這份資料的細節。

Written by

Glove Yen

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

—轉自好文作者Glove Yen_Data Science_Python資料處理套件part3-Pandas條件篩選資料
如果你喜歡他的文章、Python資料分析有興趣,歡迎回到他的Blog: glove-coding看更多:)

或接續觀看Pandas 第5講: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