天天看點

pandas基礎(part5)--透視表與交叉表

學習筆記,這個筆記以例子為主。

開發工具: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