Pandas简明教程:八、Pandas数据透视表
透視表(pivot)是由微軟發明的一個概念,1993年微軟注冊了PivotTable這一商標,而他們又在2020年正式撤銷了注冊。
關于透視表的話題隨便搜搜就是一大堆,而有些地方可能都吹得很神了。透視表的不多說,我們直接通過Pandas中關于它的操作來認識。
1、透視表的基本操作方法
再次回到張三團伙的例子:
df月份 姓名 性別 應發工資 實發工資 職位 0 1 張三 男 2000 1500 主犯 1 2 張三 男 2000 1000 主犯 2 3 張三 女 2000 15000 主犯 3 4 張三 女 2000 1500 主犯 4 5 張三 女 2000 1500 主犯 5 2 李四 男 1800 1300 從犯 6 3 李四 男 1800 1300 從犯 7 4 李四 男 1800 1300 從犯 8 5 李四 男 1800 1300 從犯 9 1 王五 女 1800 1300 龍套 10 2 王五 女 1800 1300 龍套 11 3 王五 女 1800 1300 龍套 12 4 王五 女 1800 1300 龍套這張表仔細看看,主要是記錄了3個人幾個月以來的收入情況,這就很像是公司員工的收入甚至于個人的收入了(比如把姓名一欄改成某個收入類目)。這樣的表很詳細,但也有缺點,那就是當我想看一些匯總的數據的時候,手動起來就很頭痛了。于是我們先來看一個簡單的例子:
df.pivot(index = '月份',columns = '姓名',values = '應發工資')姓名 張三 李四 王五 月份 1 2000.0 NaN 1800.0 2 2000.0 1800.0 1800.0 3 2000.0 1800.0 1800.0 4 2000.0 1800.0 1800.0 5 2000.0 1800.0 NaN上面的代碼返回的是這三個人按月的收入狀況。其中王五在5月的收入是空,而回到原表可以發現的確沒有他在這個月的收入情況。
如果我們把應用場景拉回到現實:原表即是每個員工每個月的收入,作為老板或者會計是不是就想看看員工的總收入情況。那么此時如果作為財務人員,一步就能取出老板想要看的東西。非常地方便!
由于這個對象太過重要,我們還是老實地看一遍官方文檔的說明:
| index | str或對象或str列表 |
| 用于制作新框架索引的列。 如果為None,則使用現有索引。 | |
| columns | str或對象或str列表 |
| 用于制作新框架列的列。 | |
| values | str,對象或先前列表(可選) |
| 用于填充新框架值的列。 如果未指定,將使用所有剩余的列,并且結果將具有按層次結構索引的列。 | |
| 返回類型 | |
| DataFrame。 | 返回調整后的DataFrame。 |
結果我們剛才的例子,index被重新指定為“月份”,所以新表就是按列索引的。columns是姓名,于是每個人的名字變成了列,最后values被指定為“應發工資”。這一系列操作如果變成老板的需求就成了:
給我做一個每個人的月收入報表,只要應發工資。
如果沒有感受到這種操作的便利,那就自己手動操作一下。
2、透視+統計
當然上述情況也只是其中一種,另外作為老板的我們可能也還想知道,除了詳細情況以外,各員工的總收入是怎樣的,于是
df.pivot(columns = '姓名',values = '實發工資').sum()姓名 張三 20500.0 李四 5200.0 王五 5200.0 dtype: float64注意,由于我們這次是要計算總收入,所以索引就不能再是月份,直接默認就好。而此時如果非要加上索引,那么它也會消失。
df.pivot(index='月份',columns = '姓名',values = '實發工資').sum()姓名 張三 20500.0 李四 5200.0 王五 5200.0 dtype: float64結果和上面一樣。這是因為由于我們用了sum()這個函數。它的本質是對values進行操作,而此時values被操作的維度剛好和index一致,因此index也就沒有存在的必要了。
當然,結合上述實例我們也能想得到可以用類似的方法來查詢最大值、最小值、平均值、中位數等等。具體的相關函數可以查看Pandas中DataFrame的屬性及方法大全
3、透視表的本質
做到現在相信各位同學也都能多少有點感覺了。第一個例子中我們將index和columns分開,然后就變成了一張新表。如果我們用數組的觀點來看的話,這兩個東西其實剛好就代表數據的兩個維度,每個對應位置的數據本身其實并沒有發生變化。換言之,數據透視表其實就是將這種一維表變成二維表的過程。
回到第一例,我們仔細查看就不難發現,“月份”和“姓名”是兩個完全獨立的維度,它們自己有重復,但它們的組合并沒有重復。那么這樣的表,就可以很自然地做成透視表。
反之,如果不滿足這個條件透視表就無從談起,比如:
df.pivot(index = '月份',columns = '性別',values = '應發工資') ---------------------------------------------------------------------------ValueError: Index contains duplicate entries, cannot reshape這時就報錯說有重復的項存在。這里主要是“月份”和“性別”的組合對應得有相同的值,因此就無法對它們進行透視。
那么,在實際操作過程中,就要時刻想著作為index和columns的這兩個維度的組合不存在重復值即可。
4、其它建議
上面的內容只是一個簡單的介紹,要徹底弄明白透視表還得多多去練習,把更多的實例裝進腦子才更容易融會貫通。這里我們找到一些講得比較好的貼子供大家參考:
一文看懂pandas的透視表pivot_table
python pandas庫——pivot使用心得
pandas.DataFrame.pivot — pandas 1.1.0 documentation
Python | Pandas.pivot() - GeeksforGeeks
本系列教程教程完整目錄:
一、Pandas簡介與安裝
二、Pandas基本數據結構-DataFrame與Series
三、Pandas文件讀寫
四、Pandas數據索引方式
五、Pandas簡單統計操作及通用方式
六、Pandas條件查詢
七、Pandas缺失數據的處理(數據清洗基礎)
八、Pandas數據透視表
九、表的合并、連接、拼接(數據聚合基礎)
總結
以上是生活随笔為你收集整理的Pandas简明教程:八、Pandas数据透视表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pandas简明教程-适用于竞赛、研究以
- 下一篇: Pandas简明教程:九、表的合并、连接