当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。