當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Python Pandas pivot_table方法用法及代碼示例

Pandas pivot_table(~)方法將輸入DataFrame轉換為所謂的數據透視表。數據透視表的概念最好通過示例來解釋,因此請在下麵查看它們。

參數

1. data | DataFrame

用於創建數據透視表的 DataFrame。

2. values | stringlist<string> | optional

其值將填充生成的數據透視表的列的標簽。這些值將使用指定的 aggfunc 進行聚合,這僅意味著我們計算統計量(例如總和、平均值、最大值等)來匯總這些值。

3. index | stringlist<string> | optional

將成為結果數據透視表索引的列的標簽。

4. aggfunc | functionlist<function> | optional

用於聚合值的函數。默認情況下,aggfunc=np.mean

5. fill_value | scalar | optional

要替換 NaN 的值。默認情況下,fill_value=None

6. margins | boolean | optional

是否添加顯示值總和的新行和列。默認情況下,margins=False

7. dropna | boolean | optional

是否刪除帶有 NaN 的條目。默認情況下,dropna=True

8. margins_name | string | optional

分配給包含值總和的新行和列的標簽。這僅在 margins=True 時相關。默認情況下,margins_name="All"

返回值

代表數據透視表的新DataFrame。

例子

基本用法

考慮以下關於員工收到的獎金的DataFrame:

df = pd.DataFrame({"name":["alice","alice","bob","alice","bob","bob"], "year":[2012,2012,2012,2013,2013,2013], "bonus":[10,15,15,10,10,20]})
df



   name   year  bonus
0  alice  2012   10
1  alice  2012   15
2  bob    2012   15
3  alice  2013   10
4  bob    2013   10
5  bob    2013   20

我們的目標是計算每位員工每年的獎金總額。我們可以通過創建所謂的數據透視表使用pivot_table(~)方法:

pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum)



year   2012  2013
name  
alice   25    10
bob     15    30

請注意以下事項:

  • bonus 列的值用於填充生成的 DataFrame。

  • name 列被指定為新索引。

  • year 列的值( 20122013 )成為新的列標簽。

  • aggfunc 是求和,如 NumPy 的 sum(~) 方法所示。

多重聚合

我們還可以一次計算多個聚合。除了總和之外,我們還計算每個員工每年的平均獎金:

pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=[np.sum, np.mean])



       sum          mean
year   2012  2013   2012  2013
name    
alice  25    10     12.5  10.0
bob    15    30     15.0  15.0

請注意我們如何必須在此處傳遞 aggfunc 的聚合函數列表。

多個值

假設這次我們要聚合兩列。為了證明這一點,這裏有一個 DataFrame,其中有一個新列,指示每個員工每年缺勤的天數:

df = pd.DataFrame({"name":["alice","alice","bob","alice","bob","bob"], "year":[2012,2012,2012,2013,2013,2013], "bonus":[10,15,15,10,10,20], "days_absent":[1,2,5,2,3,5]})
df



   name    year  bonus  days_absent
0  alice   2012   10        1
1  alice   2012   15        2
2  bob     2012   15        5
3  alice   2013   10        2
4  bob     2013   10        3
5  bob     2013   20        5

要計算每位員工的獎金總額以及每年的缺勤天數:

pd.pivot_table(df, values=["bonus","days_absent"], index="name", columns="year", aggfunc=np.sum)



       bonus         days_absent
year   2012   2013   2012  2013
name    
alice  25     10      3     2
bob    15     30      5     8

請注意我們如何在此處傳遞 values 的列標簽數組。

多重指數

假設我們想使用兩列作為結果 DataFrame 的索引。為了證明這一點,這裏有一個DataFrame,其中員工現在通過名字和姓氏進行標識:

df = pd.DataFrame({"first_name":["alice","alice","bob","alice","bob","bob"], "last_name":["A","B","A","A","A","B"], "year":[2012,2012,2012,2013,2013,2013], "bonus":[10,15,15,10,10,20]})
df



   first_name  last_name  year  bonus
0  alice          A       2012  10
1  alice          B       2012  15
2  bob            A       2012  15
3  alice          A       2013  10
4  bob            A       2013  10
5  bob            B       2013  20

現在,alice Aalice B 代表兩名不同的員工,因此在計算每位員工每年的總獎金時區分他們是有意義的。我們通過傳入 index 參數的列表來完成此操作:

pd.pivot_table(df, values=["bonus"], index=["first_name", "last_name"], columns="year", aggfunc=np.sum)



                        bonus
            year        2012    2013
first_name  last_name  
alice          A        10.0    10.0
               B        15.0    NaN
bob            A        15.0    10.0
               B        NaN     20.0

我們在2013中得到alice B的總獎金NaN,因為它在df中不存在。

填充缺失值

考慮以下 DataFrame :

df = pd.DataFrame({"name":["alice","bob","bob"], "year":[2012,2012,2013], "bonus":[10,15,20]})



   name   year   bonus
0  alice  2012   10
1  bob    2012   15
2  bob    2013   20

請注意,我們在 2013 中沒有有關 Alice 獎金的數據。

默認情況下,缺失值將在生成的數據透視表中由 NaN 指示:

pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum)



year   2012  2013
name  
alice  10.0  NaN
bob    15.0  20.0

我們可以選擇通過傳入fill_value參數來用我們自己的值填充這些NaN

pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum, fill_value=-1)



year   2012  2013
name  
alice   10   -1
bob     15   20

指定邊距和margins_name

考慮以下 DataFrame :

df = pd.DataFrame({"name":["alice","bob","alice","bob"], "year":[2012,2012,2013,2013], "bonus":[10,15,20,30]})
df



   name   year  bonus
0  alice  2012  10
1  bob    2012  15
2  alice  2013  20
3  bob    2013  30

通過設置 margins=True ,我們獲得額外的行和列來保存值的總和:

pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum, margins=True)



year   2012  2013  All
name   
alice  10    20    30
bob    15    30    45
All    25    50    75

請注意以下事項:

  • 行總和告訴我們每個員工獲得的獎金總額

  • 該列總和是所有員工每年賺取的獎金總額

  • 右下角的條目告訴我們所有員工在 2 年內獲得的獎金總額

默認情況下,這些新引入的行和列被分配標簽 "All" 。我們可以使用 margins_name 參數分配我們自己的標簽:

pd.pivot_table(df, ~~~, margins=True, margins_name="Total")



year   2012  2013  Total
name   
alice  10    20    30
bob    15    30    45
Total  25    50    75

指定 dropna

考慮以下 DataFrame :

df = pd.DataFrame({"name":[np.NaN,np.NaN,"alice","bob"], "year":[2012,2012,2013,2013], "bonus":[10,15,20,25]})
df



   name   year  bonus
0  NaN    2012   10
1  NaN    2012   15
2  alice  2013   20
3  bob    2013   25

在這裏,我們缺少 2012 年員工的姓名。這意味著生成的數據透視表將具有與 2012 對應的列,並填充 NaN

默認情況下, dropna=True ,這意味著生成的數據透視表中條目全部為 NaN 的列將被刪除:

pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum)



year   2013
name 
alice  20
bob    25

我們可以通過設置dropna=False來選擇保留NaN,如下所示:

pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum, dropna=False)



year   2012  2013
name  
alice  NaN   20
bob    NaN   25

相關用法


注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 Pandas | pivot_table method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。