學習筆記,這個筆記以例子為主。
開發工具:Spyder
文章目錄
- Pandas透視表
- Pandas交叉表
Pandas透視表
透視表(pivot table)是各種電子表格程式和其他資料分析軟體中一種常見的資料彙總工具。它根據一個或多個鍵對資料進行分組聚合,并對每個分組進行資料彙總。
- 文法
# 以A與B做分組彙總資料,針對D的每個值列級分組統計,統計每個分組下C列的最大值,并添加行、列小計
data.pivot_table(index=['A', 'B'], values=['C'],
columns=['D'], margins=True, aggfunc='max')
接下來,我們用幾個例子來學習如何用pandas來制作想要的資料透視表。
首先,我們來康康接下來幾個例子所要使用的資料:
代碼:
import pandas as pd
leftD = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee',
'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],
'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],
'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8],
'gender':['M', 'F', 'M', 'M', 'M',
'F', 'M', 'M', 'M', 'F'],
'Bunny_id':[1, 2, 3, 4, 2, 4, 3, 1, 4, 5]}
rightD = {'Bunny_id':[1, 2, 3, 4, 5],
'foods':['A', 'B', 'C', 'D', 'E']}
df_leftD = pd.DataFrame(leftD)
df_rightD = pd.DataFrame(rightD)
df = pd.merge(df_leftD, df_rightD, how = 'outer')
print(df)
資料:
Bunny_id age gender name weight foods
0 1 9 M Ada 8 A
1 1 9 M Peter 5 A
2 2 9 F Tom 4 B
3 2 10 M Lee 10 B
4 3 10 M Black 5 C
5 3 8 M Blue 4 C
6 4 10 M Jack 6 D
7 4 10 F Yellow 10 D
8 4 7 M Green 4 D
9 5 8 F Trump 8 E
- 例子1
代碼:
#以Bunny_id做分組彙總資料,預設統計所有列的均值
print(df.pivot_table(index=['Bunny_id']))
結果:
age weight
Bunny_id
1 9.0 6.500000
2 9.5 7.000000
3 9.0 4.500000
4 9.0 6.666667
5 8.0 8.000000
由結果可知,由于除了Bunny_id這個變量以外,隻有age和weight為數值型變量,故pandas計算了age和weight的均值。
- 例子2
代碼:
#以Bunny_id與gender做分組彙總資料,預設統計所有列的最大值
print(df.pivot_table(index=['Bunny_id', 'gender'], aggfunc='max'))
結果:
age foods name weight
Bunny_id gender
1 M 9 A Peter 8
2 F 9 B Tom 4
M 10 B Lee 10
3 M 10 C Blue 5
4 F 10 D Yellow 10
M 10 D Jack 6
5 F 8 E Trump 8
由結果可知,pandas先按照Bunny_id進行分組,再按照gender進行分組。最後對分組結果,分别計算age、foods、name、weight的最大值。
- 例子3
代碼:
#以Bunny_id與gender做分組彙總資料,統計age列的均值
print(df.pivot_table(index=['Bunny_id', 'gender'], values=['age']))
結果:
age
Bunny_id gender
1 M 9.0
2 F 9.0
M 10.0
3 M 9.0
4 F 10.0
M 8.5
5 F 8.0
由結果可知,pandas先對Bunny_id和gender進行分組,并隻顯示age的分組平均值。
- 例子4
代碼:
#以Bunny_id與gender做分組彙總資料,針對weight的每個值列級分組,統計age列的均值。
print(df.pivot_table(index=['Bunny_id', 'gender'],
values=['age'], columns=['weight']))
結果;
age
weight 4 5 6 8 10
Bunny_id gender
1 M NaN 9.0 NaN 9.0 NaN
2 F 9.0 NaN NaN NaN NaN
M NaN NaN NaN NaN 10.0
3 M 8.0 10.0 NaN NaN NaN
4 F NaN NaN NaN NaN 10.0
M 7.0 NaN 10.0 NaN NaN
5 F NaN NaN NaN 8.0 NaN
由結果可知,Bunny_id和gender的組合作為行,weight作為列,共同構造了二維表,表中值為每個分組中age的平均值,如果對應分組沒有值,則該位置用NaN代替。
Pandas交叉表
交叉表(cross-tabulation, 簡稱crosstab)是一種用于計算分組頻率的特殊透視表
- 文法
# 按照A列的觀測值進行分組,針對不同的B,統計頻數
pd.crosstab(data.A, data.B, margins=True)
- 例子(接上面透視表案例中的資料)
print(pd.crosstab(df.gender, df.foods))
foods A B C D E
gender
F 0 1 0 1 1
M 2 1 2 2 0