此系列文章收錄在公眾號中:數據大宇宙 > 數據處理 >E-pd
> 經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandas
本系列上一節文章最後我隨手使用了 pandas 中的透視表操作,之後有些小夥伴詢問我相關的問題。正好 pandas 的 pivot_table 也是與 Excel 透視表對應。本文簡單教你入門使用 pandas 完成透視表功能。
繼續使用鐵達尼號沉船事件的乘客名單作為例子:
- pclass:船艙等級
- survived:是否生還
- fare:票價
- sex:性別
- home.dest:住址
這裡只簡單說明怎麼製作透視表,以方便那些不熟悉透視表的小夥伴:
- 3步完成
分析目標涉及的維度:
- 性別
- 生還率
這些維度用於分類依據,放入透視表的行或列標籤:
- 把 sex 欄位拖入 行標籤,survived 欄位拖入 列標籤
- 還需要統計人數,人名總是有的,因此把 name 欄位拖入 數值區域
- 透視表立刻出結果,行標籤 放入的欄位的唯一值,被顯示在透視表左側。列標籤 放入的欄位的唯一值,被顯示在透視表的上方
只看數值看不出門路,設置百分比吧:
- 點中透視表任意一格,滑鼠右鍵
- 按上圖指示完成
- 女性 生還率遠高於 男性!!
> 接下來不再顯示 Excel 透視表操作
pandas 要做出透視表的效果,實際與 Excel 透視表的概念基本一致:
- 參數 index 就是 Excel 透視表中的 行標籤
- 參數 columns : Excel 透視表中的 列標籤
- 參數 values:Excel 透視表中的 數值區域
- 參數 aggfunc:Excel 透視表中的 數值區域 的欄位的統計方式(Excel 默認是計數)
"好像少了點東西……"
沒有總計行列,可以通過參數設置:
- 參數 margins 默認為 False,顯示總計行列
- 參數 margins_name ,設置總計行列的索引值
> 實際上很少需要使用這2個參數,因為 pandas 中添加這2列是非常簡單
"Excel 透視表是百分比呀"
pandas 透視表功能沒有參數設置,因為本身透視出來的還是一個 DataFrame ,這可以利用之前學到的一切技巧來為這個 DataFrame "添油加醋":
- 默認情況下,如果把一個 DataFrame 作為文本顯示,小數是不會變百分比,這裡可以設置 pd.set_option('display.float_format', '{:.2%}'.format) 。這種設置不會影響數據類型,比如把此結果輸出到 Excel ,仍然是小數
- 行9:每行(axis=1)做運算(apply),行中每個數字(r) 除以(/) 行中剔除最後一個數據(r[:-1])的總和(sum)
我們用透視表分析 船艙等級(1表示一等艙,2表示二等艙……) 與 生還率的影響。
下面是 Excel 透視表結果:
接著是 pandas 實現:
- 修改 index 參數為 pclass,即可按船艙等級匯總
- 行9:不想再重複編寫那段"非人"看的佔比計算,直接調用一個自定義的函數(函數實現看源碼)
從結果可以看到,頭等艙生還率最高(更多原因是船艙等級越低,位置越靠近船底部,逃生越困難)
"我還想結合性別看看船艙等級對生還率的影響,怎麼搞?"
很簡單,pivot_table 中的大部分參數都可以放入多個欄位(跟 Excel 透視表操作一樣):
- index 參數傳入多個欄位的列表
從結果看到,每個等級的船艙還是"女性比男性更可能生還"
"嘿,感覺直接用 Excel 透視表就好了,還寫啥代碼,麻煩死"
如果只是上述這些簡單匯總的分析,我也建議直接用 Excel 透視表。但實際工作中,不可能只是這麼簡單的匯總。
以前我發布過一篇文章,曾經使用 power bi 對這個數據進行初步分析,文中發現,裡面有些人是一起登記上船的,而結伴上船的人有更高的生還率。
> 相關文章:[公眾號 -> 數據分析 -> 探索分析]。文章中並沒有給出 pandas 代碼。
但是,原始數據是沒有欄位可以直接反映是否有結伴上船的情況。
數據中 ticket 列是船票號,**有相同的船票號並且多於1人以上的,可以視為是購買套票**的,也就是一起上船的。
解決思路就是:把 ticket 列內容相同的歸為一組,組內有多於1行記錄的,就是有小夥伴一起上船的
相信一直看本系列的小夥伴馬上就知道,這在 pandas 中不就是分組操作嗎!下面是代碼:
- 行3:這句就是把每個人標記為"是否套票"的實現,這個不多解析了,幾乎與上面說的中文語義一致
- 行5-10:利用透視表,對欄位 isgroup 統計一下生還人數比例
- 很明顯,沒有小夥伴的人裡面(上圖結果的第一行),生還比例只有 27.21% 。相比較,有小夥伴一起上船的乘客(上圖結果的第二行),生還人數比例就比較高
> 上面結果的行列顯示不太好看(isgroup 顯示 True 和 False,survived 顯示 0 和 1),你知道怎麼把他們替換成友好的中文內容嗎?
本文重點:
- DataFrame.pivot_table 是一個快速統計的好工具,其概念與 Excel 的數據透視表一致
需要源碼的小夥伴,公眾號發送"數據處理"
覺得寫得不錯,點擊右下方"在看"
如果希望從零開始學習 pandas ,那麼可以看看我的 pandas 專欄。