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