pandas pivot 占比_数据处理进阶pandas入门(十八)
回顧
在數據處理進階pandas入門(十七)中,我們介紹了pandas中對groupby()方法的分組數據處理的兩個方法:transform()和apply()。我們需要掌握好這兩個方法,對分組數據進行靈活處理。今天我們講一下pandas中生成數據透視表和交叉表的方法。
生成透視表方法pivot_table()
數據透視表就是將數據的每一列作為輸入,輸出將數據不斷細分成多個維度累計信息的二維數據表。簡單來說,數據透視表更像是一種多維的groupb累計操作。pandas中使用pivot_table()方法來生成透視表,基本用法如下。?
import numpy as npimport pandas as pddate_range = pd.to_datetime(['2019-5-29', '2019-5-30', '2019-5-31']*3)df = pd.DataFrame({'date':date_range, 'key': list('abcdabcdb'), 'values':np.random.rand(9)*10})print(df)print("---------------")print(pd.pivot_table(df, values='values', index='date', columns='key', aggfunc=np.sum))pivot_table()方法接收一個DataFrame對象 ,values表示要聚合的列;index表示從原數據中篩選出列作為數據透視表中的index索引;columns表示從原數據中篩選出列作為數據透視表中的columns索引;aggfunc表示用于聚合的函數(支持Numpy計算函數),默認為np.mean,可以用字符串或“np.”兩種形式表示。運行結果如下圖所示。
pivot_table()方法基本用法
上述代碼生成的數據透視表中有缺失值, pivot_table()方法對缺失值的處理默認以NaN填充。如果我們不想使用NaN,我們也可以通過設置fill_value來指定任意值作為缺失值的填充,基本用法如下。?
import numpy as npimport pandas as pddate_range = pd.to_datetime(['2019-5-29', '2019-5-30', '2019-5-31']*3)df = pd.DataFrame({'date':date_range, 'key': list('abcdabcdb'), 'values':np.random.rand(9)*10})print(df)print("---------------")print(pd.pivot_table(df, values='values', index='date', columns='key', aggfunc=np.sum, fill_value=0))再次運行可以發現,缺失值的地方填充值由原來的NaN變成了0。運行結果如下圖所示。
pivot_table()方法指定缺省值填充
pivot_table()方法支持對多列數據同時做數據透視,我們只需給index傳入一個包含多列索引的列表即可。例如上述代碼中,我們給index參數傳入['date', 'key'],pivot_table()方法就會對date列和key列共同做數據透視。代碼如下。 ?
import numpy as npimport pandas as pddate_range = pd.to_datetime(['2019-5-29', '2019-5-30', '2019-5-31']*3)df = pd.DataFrame({'date':date_range, 'key': list('abcdabcdb'), 'values':np.random.rand(9)*10})print(df)print("---------------")print(pd.pivot_table(df, values='values', index=['date', 'key'], aggfunc=len))運行結果如下圖所示。我們使用len作為聚合函數,由于原DataFrame中2019-5-31對應b有兩組數據,所以返回長度為2。
pivot_table()方法多列數據透視
生成交叉表方法crosstab()
交叉表是一種常用的分類匯總表格,利用交叉表查詢數據非常直觀明了。pandas中使用crosstab()方法來生成交叉表,crosstab()方法一般用于計算因子的頻率,可以對字符串類型的數據進行透視分析,基本用法如下。?
import numpy as npimport pandas as pddf = pd.DataFrame({'A':[1, 2, 2, 2, 2], 'B':['a', 'a', 'b', 'b', 'b'], 'C':[10, 10, np.nan, 10, 10]})print(df)print("---------------")print(pd.crosstab(df['A'], df['B']))crosstab()方法如果只接收兩個Series,那么會生成一個頻率表。上述代碼中傳入了df['A']、df['B'],那么生成的頻率表就是用A的唯一值去統計b的唯一值出現的次數。運行結果如下圖所示,1對應‘a’出現的次數為1,2對應‘a’出現的次數為1,2對應‘b’出現的次數為3。
crosstab()方法基本用法
既然是頻率表,我們往往希望看到的是占比情況,這時只需設置crosstab()方法中的normalize參數即可。基本用法如下。?
import numpy as npimport pandas as pddf = pd.DataFrame({'A':[1, 2, 2, 2, 2], 'B':['a', 'a', 'b', 'b', 'b'], 'C':[10, 10, np.nan, 10, 10]})print(df)print("---------------")print(pd.crosstab(df['A'], df['B'], normalize=True))normalize參數默認為False,當我們設置normalize=True時,頻率表中的所有值就會除以總和來進行歸一化(計算占比)。運行結果如下圖所示。
crosstab()方法頻率數據歸一化
crosstab()方法中有兩個參數:values和aggfunc,這兩個參數跟生成透視表方法pivot_table()中的參數一樣。事實上,crosstab()方法配合values和aggfunc這兩個參數也能生成透視表。基本用法如下。?
import numpy as npimport pandas as pddate_range = pd.to_datetime(['2019-5-29', '2019-5-30', '2019-5-31']*3)df = pd.DataFrame({'date':date_range, 'key': list('abcdabcdb'), 'values':np.random.rand(9)*10})print(df)print("---------------")print(pd.crosstab(df['date'], df['key'], values=df['values'], aggfunc=np.sum))傳入的前兩個Series會分別作為透視表的index和columns索引,values為要聚合的列,運行結果如下圖所示,可以看到,跟pivot_table()生成的透視表完全一樣。
pivot_table()生成透視表
crosstab()方法可以通過設置margins參數給生成的表添加行/列邊距,基本用法如下。?
import numpy as npimport pandas as pddate_range = pd.to_datetime(['2019-5-29', '2019-5-30', '2019-5-31']*3)df = pd.DataFrame({'date':date_range, 'key': list('abcdabcdb'), 'values':np.random.rand(9)*10})print(df)print("---------------")print(pd.crosstab(df['date'], df['key'], values=df['values'], aggfunc=np.sum, margins=True))margins參數默認為False,當我們設置margins=True時,會在生成的表上添加行/列,用于計算各行各列的和。運行結果如下圖所示。
crosstab()添加行/列
總結
以上內容介紹了pandas中生成數據透視表和交叉表的方法。透視表pivot_table()方法是一種進行分組統計的函數,參數aggfunc決定統計類型;而交叉表crosstab()方法是一種特殊的pivot_table()方法,雖然也可以生成透視表,但我們一般將它專用于計算分組頻率。感謝大家的支持與關注,歡迎批評指正,歡迎一起交流~
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的pandas pivot 占比_数据处理进阶pandas入门(十八)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ie 不执行回调函时_javascrip
- 下一篇: python竞赛_浅谈Python在信息