pivot_table 透视表在 Pandas 中是一个非常强大和灵活的工具,它支持许多高级功能,可以用于复杂的数据分析和报告生成。以下是一些更高级的用法和详细说明
1. 多级索引(MultiIndex)
pivot_table 支持多级索引,这意味着你可以根据多个列创建行索引和列索引。这在处理复杂的
数据结构时非常有用。
import pandas as pd
# 创建一个示例 DataFrame
data = {
'部门': ['A', 'A', 'B', 'B'],
'职位': ['经理', '开发', '经理', '开发'],
'薪资': [500, 600, 700, 800],
'性别': ['男', '女', '男', '女']
}
# 将数据转化为pandas的dataframe
df = pd.DataFrame(data)
#创建透视表
pivot_table = pd.pivot_table(
df,
values='薪资',
index=['部门', '职位'],
columns=['性别'],
aggfunc='sum'
)
pivot_table参数含义说明:
- data: 输入的DataFrame数据。
- values: 需要聚合的列。可以是单个或多个列名。
- index: 用于分组的列,透视表的行标签。
- columns: 用于分组的列,透视表的列标签。
- aggfunc: 聚合函数,例如mean、sum、count等。默认是mean。
- fill_value: 填充缺失值的值。
- margins: 是否添加行/列的总计项,默认是False。
- margins_name: 总计项的名称,默认为All。
- dropna: 是否丢弃所有条目为NaN的列。
- observed: 对于分类数据,是否仅显示实际观测到的组合。
2. 使用 margins 进行总计
设置 margins=True 将在透视表的底部和/或右侧添加总计行和列。你还可以通过 margins_name 参数自定义总计的名称。
pivot_table = pd.pivot_table(
df,
values='薪资',
index='部门',
columns='职位',
aggfunc='sum',
margins=True,
margins_name='总计'
)
3. 自定义聚合函数
aggfunc 参数不仅接受预定义的聚合函数,还可以接受自定义函数。这对于执行复杂的聚合操作非常有用。
def custom_agg(x):
return x.max() - x.min()
pivot_table = pd.pivot_table(
df,
values='薪资',
index='部门',
columns='职位',
aggfunc=custom_agg
)
4. 处理缺失值
pivot_table 提供了几个参数来处理缺失值:
- fill_value: 用指定的值替换 NaN 值。
- dropna: 设置为 True 时,会删除没有数据的行和列。
pivot_table = pd.pivot_table(
df,
values='薪资',
index='部门',
columns='职位',
aggfunc='sum',
fill_value=0,
dropna=False
)
5. 分组和子集化数据
你可以在 pivot_table 中使用 groupby 功能对数据进行分组,并只对特定的子集进行分析。
pivot_table = pd.pivot_table(
df.groupby('部门').head(2), # 只考虑每个部门的前两个记录
values='薪资',
index='部门',
columns='职位',
aggfunc='sum'
)
6. 使用计算列
pivot_table 还允许你使用计算列,即在创建透视表时动态计算新的列。
pivot_table = pd.pivot_table(
df,
values='薪资',
index='部门',
columns='职位',
aggfunc='sum'
)
pivot_table['总薪资'] = pivot_table.sum(axis=1) # 计算每行的总薪资
7. 多个聚合函数
你可以为不同的列指定不同的聚合函数,甚至为同一列指定多个聚合函数。
pivot_table = pd.pivot_table(
df,
values=['薪资', '年龄'],
index='部门',
columns='职位',
aggfunc={'薪资': 'sum', '年龄': ['mean', 'max']}
)
这些高级用法使得 pivot_table 成为一个非常强大的数据分析工具,可以用于处理各种复杂的数据结构和分析需求。通过灵活地使用这些功能,你可以轻松地创建满足特定需求的透视表。
以下是带有注释的代码,展示了如何使用 Pandas 的 pivot_table 函数以及一些高级用法:
import pandas as pd
# 假设 df 是这样的 DataFrame
# 部门 职位 薪资
# 0 A 经理 500
# 1 A 开发 600
# 2 B 经理 700
# 3 B 开发 800
data = {
'部门': ['A', 'A', 'B', 'B'],
'职位': ['经理', '开发', '经理', '开发'],
'薪资': [500, 600, 700, 800]
}
# 创建 DataFrame
df = pd.DataFrame(data)
# 创建透视表,按部门和职位对薪资进行求和
pivot_table = pd.pivot_table(
df,
values='薪资', # 要汇总的列名
index='部门', # 行索引的列名
columns='职位', # 列索引的列名
aggfunc='sum' # 聚合函数
)
# 打印透视表
print(pivot_table)
# 使用 margins 进行总计
pivot_table_with_margins = pd.pivot_table(
df,
values='薪资', # 要汇总的列名
index='部门', # 行索引的列名
columns='职位', # 列索引的列名
aggfunc='sum', # 聚合函数
margins=True, # 添加总计行和列
margins_name='总计' # 设置总计行的名称
)
# 打印带有总计的透视表
print(pivot_table_with_margins)
# 自定义聚合函数
def custom_agg(x):
return x.max() - x.min()
# 使用自定义聚合函数创建透视表
pivot_table_custom_agg = pd.pivot_table(
df,
values='薪资', # 要汇总的列名
index='部门', # 行索引的列名
columns='职位', # 列索引的列名
aggfunc=custom_agg # 自定义聚合函数
)
# 打印使用自定义聚合函数的透视表
print(pivot_table_custom_agg)
# 处理缺失值
pivot_table_fillna = pd.pivot_table(
df,
values='薪资', # 要汇总的列名
index='部门', # 行索引的列名
columns='职位', # 列索引的列名
aggfunc='sum', # 聚合函数
fill_value=0, # 用 0 替换 NaN 值
dropna=False # 即使某些组合没有数据,也保留对应的行和列
)
# 打印处理缺失值后的透视表
print(pivot_table_fillna)
# 使用计算列
pivot_table_with_calculated_column = pivot_table_with_margins.copy()
pivot_table_with_calculated_column['总薪资'] = pivot_table_with_margins.sum(axis=1) # 计算每行的总薪资
# 打印带有计算列的透视表
print(pivot_table_with_calculated_column)
# 多个聚合函数
pivot_table_multiple_aggs = pd.pivot_table(
df,
values=['薪资', '年龄'], # 要汇总的列名列表
index='部门', # 行索引的列名
columns='职位', # 列索引的列名
aggfunc={'薪资': 'sum', '年龄': ['mean', 'max']} # 为不同列指定不同的聚合函数
)
# 打印使用多个聚合函数的透视表
print(pivot_table_multiple_aggs)
这些代码示例展示了如何使用 pivot_table 进行数据透视,包括如何添加总计、使用自定义聚合函数、处理缺失值、添加计算列以及为不同列指定多个聚合函数。通过这些示例,你可以更好地理解 pivot_table 的灵活性和强大功能。