Pandas pivot_table(~)方法将输入DataFrame转换为所谓的数据透视表。数据透视表的概念最好通过示例来解释,因此请在下面查看它们。
参数
1. data | DataFrame
用于创建数据透视表的 DataFrame。
2. values | string 或 list<string> | optional
其值将填充生成的数据透视表的列的标签。这些值将使用指定的 aggfunc 进行聚合,这仅意味着我们计算统计量(例如总和、平均值、最大值等)来汇总这些值。
3. index | string 或 list<string> | optional
将成为结果数据透视表索引的列的标签。
4. aggfunc | function 或 list<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列的值(2012和2013)成为新的列标签。 -
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 A 和 alice 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
相关用法
- Python Pandas pivot方法用法及代码示例
- Python pandas.arrays.IntervalArray.is_empty用法及代码示例
- Python pyspark.pandas.Series.dropna用法及代码示例
- Python pyspark.pandas.groupby.SeriesGroupBy.unique用法及代码示例
- Python pandas.DataFrame.ewm用法及代码示例
- Python pandas.api.types.is_timedelta64_ns_dtype用法及代码示例
- Python pandas.DataFrame.dot用法及代码示例
- Python pandas.DataFrame.apply用法及代码示例
- Python pyspark.pandas.Series.dt.weekday用法及代码示例
- Python pyspark.pandas.DataFrame.select_dtypes用法及代码示例
- Python pyspark.pandas.date_range用法及代码示例
- Python pyspark.pandas.isnull用法及代码示例
- Python pyspark.pandas.Series.hasnans用法及代码示例
- Python pandas.DataFrame.combine_first用法及代码示例
- Python pyspark.pandas.Series.rmul用法及代码示例
- Python pyspark.sql.functions.grouping_id用法及代码示例
- Python pyspark.pandas.Series.str.repeat用法及代码示例
- Python pyspark.pandas.DataFrame.groupby用法及代码示例
- Python pandas.Series.iloc用法及代码示例
- Python pyspark.ml.feature.DCT用法及代码示例
- Python pandas.Timestamp.to_numpy用法及代码示例
- Python pyspark.sql.functions.hours用法及代码示例
- Python pandas.Index.value_counts用法及代码示例
- Python pyspark.pandas.Series.add_prefix用法及代码示例
- Python pandas.DatetimeTZDtype用法及代码示例
注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 Pandas | pivot_table method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
