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