一、透視表
Excel
中有一個強大的功能 —— 數據透視表(pivot table
)。
利用數據透視表可以快速的進行分類匯總,自由組合字段快速計算,而這些只需要拖拉拽就可以實現。
典型的數據格式是扁平的,只包含行和列,不方便總結信息。
而透視表可以快速抽取有用的信息。
在 Pandas
中,可以利用 pivot_table
函數實現該功能。
二、pivot_table函數介紹
使用語法:
DataFrame.pivot_table(data,
values=None,
index=None,
columns=None,
aggfunc='mean',
fill_value=None,
margins=False,
dropna=True,
margins_name='All',
observed=False,
sort=True)
參數解釋:
data -- DataFrame格式數據
values -- 需要匯總計算的列
index -- 行分組鍵
columns -- 列分組鍵
aggfunc -- 聚合函數,或函數列表,默認為平均值
fill_value -- 缺失值填充
margins -- 是否添加行列的總計
dropna -- 如果列的值都為NaN則不計算
margins_name -- 匯總行列名稱
observed -- 是否顯示觀測值
三、pivot_table實操
1.構造測試數據集
import pandas as pd
import numpy as np
df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6],
'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
df
'''
bar baz foo zoo
0 A 1 one x
1 B 2 one y
2 C 3 one z
3 A 4 two q
4 B 5 two w
5 C 6 two t
'''
pd.pivot_table(df, index='bar',values='baz', aggfunc=sum)
pd.pivot_table(df, index=['bar', 'foo'], aggfunc=np.mean, values='baz')
pd.pivot_table(df, index='bar', aggfunc=[np.sum, np.mean], values='baz')
pd.pivot_table(df, index='bar', columns='foo', aggfunc=[np.sum], values='baz')
pd.pivot_table(df, index='bar', columns='foo', aggfunc=[np.sum], values='baz', margins=True)
# 火箭隊當家球星James Harden某一賽季比賽數據
df2 = pd.read_csv(r'C:\Users\Hider\Desktop\basketball.txt', encoding='GBK')
df2
附上數據表:
對手,勝負,主客場,命中,投籃數,投籃命中率,3分命中率,籃板,助攻,得分
勇士,勝,客,10,23,0.435,0.444,6,11,27
國王,勝,客,8,21,0.381,0.286,3,9,27
小牛,勝,主,10,19,0.526,0.462,3,7,29
灰熊,負,主,8,20,0.4,0.25,5,8,22
76人,勝,客,10,20,0.5,0.25,3,13,27
黃蜂,勝,客,8,18,0.444,0.4,10,11,27
灰熊,負,客,6,19,0.316,0.222,4,8,20
76人,負,主,8,21,0.381,0.429,4,7,29
尼克斯,勝,客,9,23,0.391,0.353,5,9,31
老鷹,勝,客,8,15,0.533,0.545,3,11,29
爵士,勝,主,19,25,0.76,0.875,2,13,56
騎士,勝,主,8,21,0.381,0.429,11,13,35
灰熊,勝,主,11,25,0.44,0.429,4,8,38
步行者,勝,客,9,21,0.429,0.25,5,15,26
猛龍,負,主,8,25,0.32,0.273,6,11,38
太陽,勝,客,12,22,0.545,0.545,2,7,48
灰熊,勝,客,9,20,0.45,0.5,5,7,29
掘金,勝,主,6,16,0.375,0.143,8,9,21
尼克斯,勝,主,12,27,0.444,0.385,2,10,37
籃網,勝,主,13,20,0.65,0.615,10,8,37
步行者,勝,主,8,22,0.364,0.333,8,10,29
湖人,勝,客,13,22,0.591,0.444,4,9,36
爵士,勝,客,8,19,0.421,0.333,5,3,29
開拓者,勝,客,16,29,0.552,0.571,8,3,48
鵜鶘,勝,主,8,16,0.5,0.4,1,17,26
2.index
每個 pivot_table
必須擁有一個 index
。
# index 就是層次字段
pd.pivot_table(df2,index=u'對手')
pd.pivot_table(df2, index=[u'對手', u'主客場'])
pd.pivot_table(df2, index=[u'主客場', u'對手'])
3.values
對需要的計算數據進行篩選。
pd.pivot_table(df2, index=[u'主客場', u'勝負'], values=[u'得分', u'助攻', u'籃板'])
'''
助攻 得分 籃板
主客場 勝負
主 勝 10.555556 34.222222 5.444444
負 8.666667 29.666667 5.000000
客 勝 9.000000 32.000000 4.916667
負 8.000000 20.000000 4.000000
'''
4.aggfunc
聚合時的函數操作,默認是求平均值。
pd.pivot_table(df2, index=[u'主客場', u'勝負'], values=[u'得分', u'助攻', u'籃板'], aggfunc=[np.sum, np.mean])
'''
sum mean
助攻 得分 籃板 助攻 得分 籃板
主客場 勝負
主 勝 95 308 49 10.555556 34.222222 5.444444
負 26 89 15 8.666667 29.666667 5.000000
客 勝 108 384 59 9.000000 32.000000 4.916667
負 8 20 4 8.000000 20.000000 4.000000
'''
aggfunc
也可以使用 dict
類型。
pd.pivot_table(df2, index=[u'對手', u'勝負'],
columns=[u'主客場'],
values=[u'得分', u'助攻'],
aggfunc={u'得分':np.mean, u'助攻':[min,max,np.mean]},
fill_value=0)
5.columns
設置列層次字段,作為可選方式。
pd.pivot_table(df2, index=u'對手', columns=u'主客場', values=u'得分', aggfunc=np.sum)
6.fill_value
填充空值。
pd.pivot_table(df2, index=u'對手', columns=u'主客場', values=u'得分', aggfunc=np.sum, fill_value=0)
7.margins
匯總行列。
pd.pivot_table(df2, index=u'對手', columns=u'主客場', values=u'得分', aggfunc=np.sum, fill_value=0, margins=True)
8.透視之后的過濾
建立透視表之后,可以通過 query
進行查詢結果。
df.query('bar == "A"')
df.query('bar == ["A","B"]')
四、pivot函數介紹
使用語法:
Pandas.pivot(data, index=None, columns=None, values=None)
實操:
df.pivot(index='foo', columns='bar', values='baz')
df.pivot(index='foo', columns='bar')['baz']
df.pivot(index='foo', columns='bar', values=['baz','zoo'])
# Exception: Data must be 1-dimensional
五、pivot 和 pivot_table 區別
pandas.pivot
的重點在於 reshape
, 合並同類項,所以在行與列的交叉點值的索引應該是唯一值,如果不是唯一,則會報錯:
ValueError: Index contains duplicate entries, cannot reshape
盡量使用 pivot_table
可避免這個問題。
pivot_talbe
函數多了 aggfunc
參數,可專門指定對聚合后的行列做如何的操作,避免錯誤。
參考鏈接:pandas.DataFrame.pivot_table
參考鏈接:pandas.pivot
參考鏈接:在pandas中使用數據透視表