You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:44:03