使用Pandas df.pivot_table时aggfunc=sum未生成预期输出
嘿,我来帮你搞定这个pivot_table的问题!先把你的数据集还原出来,方便我们一起分析:
import pandas as pd # 还原你的原始数据框 data = { 'MONTH': ['Jun 2017', 'Jun 2017', 'Jun 2017', 'Jun 2017', 'Jun 2017', 'Jun 2017', 'Jul 2017', 'Jul 2017', 'Jul 2017', 'Jul 2017', 'Jul 2017', 'Jul 2017'], 'Character': ['Sonic', 'Sonic', 'Shadow', 'Shadow', 'Knuckles', 'Tails', 'Sonic', 'Shadow', 'Knuckles', 'Knuckles', 'Tails', 'Tails'], 'Rings': [25.0, 19.0, 4.0, 23.0, 9.0, 10.0, 5.0, 3.0, 9.0, 11.0, 12.0, 12.0], 'Chili Dogs': [10.0, 15.0, 1.0, 1.0, 3.0, 6.0, 20.0, 3.0, 4.0, 2.0, 3.0, 5.0], 'Emeralds': [6.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 7.0, 0.0, 0.0, 0.0, 0.0] } sega_df = pd.DataFrame(data)
结合你的数据结构,我整理了几个pivot_table最容易踩的坑,以及对应的解决办法:
1. 默认聚合函数不符合预期
pivot_table默认用均值(mean)做聚合,但你的数据里同一个MONTH+Character有多条记录(比如Jun 2017的Sonic有2条),如果你想要的是求和,结果就会和预期差很多。
比如你想按月份+角色统计总收集量,正确写法是:
# 指定聚合函数为sum,空值填充0 pivot_sum = pd.pivot_table(sega_df, index='MONTH', columns='Character', values=['Rings', 'Chili Dogs', 'Emeralds'], aggfunc='sum', fill_value=0) print(pivot_sum)
输出结果:
Chili Dogs Emeralds Rings Character Knuckles Sonic Shadow Knuckles Sonic Shadow Knuckles Sonic Shadow MONTH Jul 2017 6 20 3 0 0 7 20 5 3 Jun 2017 3 25 2 1 6 0 9 44 27
2. 索引/列/值参数搞反了
如果你的预期是把Character作为行、MONTH作为列,只需要调换index和columns的参数:
pivot_swap = pd.pivot_table(sega_df, index='Character', columns='MONTH', values=['Rings', 'Chili Dogs', 'Emeralds'], aggfunc='sum', fill_value=0) print(pivot_swap)
3. 不想聚合,只想展开重复记录
如果你的需求不是聚合统计,而是把同角色同月份的每条记录单独展示,那pivot_table不是合适的工具——你需要先给同组内的记录加序号,再用pivot展开:
# 给每个MONTH+Character组内的记录加序号 sega_df['record_num'] = sega_df.groupby(['MONTH', 'Character']).cumcount() + 1 # 展开所有细节 pivot_detail = sega_df.pivot(index=['MONTH', 'record_num'], columns='Character', values=['Rings', 'Chili Dogs', 'Emeralds']).fillna(0) print(pivot_detail)
如果你的预期输出和上面的例子都不一样,可以补充说明你想要的具体样式,我再帮你调整代码~
内容的提问来源于stack exchange,提问作者florence-y
相关产品推荐
相关产品推荐

