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

使用Pandas pivot_table求和时部分有数据列返回0的问题求助

问题分析与解决

原始数据

idnamestart_dateclicksconversionsinstallsdownloads
101India2023-06-06140NaN
101India2023-06-06250NaN
101India2023-06-06160NaN
201Kenya2023-09-15580NaN
201Kenya2023-09-15210NaN
201NaNNaNNaNNaNNaN10
201NaNNaNNaNNaNNaN5
201NaNNaNNaNNaNNaN4

你的代码

pivot_df = pd.pivot_table(
    df,
    index=['id','name','start_date'],
    aggfunc={'clicks': 'sum','conversions': 'sum','installs': 'sum', 'downloads': 'sum'})  

实际输出 vs 预期输出

实际输出

idnamestart_dateclicksconversionsinstallsdownloads
101India2023-06-0641500
201Kenya2023-09-157900

预期输出

idnamestart_dateclicksconversionsinstallsdownloads
101India2023-06-0641500
201Kenya2023-09-1579019

问题原因

你设置的分组条件是['id','name','start_date'],但那些带有downloads数值的行(10、5、4)对应的name和start_date都是NaN,它们会被单独分到一个id=201, name=NaN, start_date=NaN的分组里,和Kenya的分组完全分开。所以求和时这部分downloads的数值不会被算到Kenya的分组中,而你的实际输出里没显示这个NaN分组(因为其他列求和都是0,可能被忽略了),导致看起来downloads结果是0。


解决办法

先把同一个id下缺失的name和start_date填充为该id对应的有效值,再执行透视求和:

代码实现

# 按id分组,填充缺失的name和start_date
df['name'] = df.groupby('id')['name'].ffill().bfill()
df['start_date'] = df.groupby('id')['start_date'].ffill().bfill()

# 重新执行透视
pivot_df = pd.pivot_table(
    df,
    index=['id','name','start_date'],
    aggfunc={'clicks': 'sum','conversions': 'sum','installs': 'sum', 'downloads': 'sum'})  

这样处理后,id=201的那三行downloads数据会被填充上Kenya和2023-09-15,分组时就会和之前的Kenya行合并,downloads求和结果就是10+5+4=19,和预期一致。

如果你的数据中每个id对应的name和start_date是唯一的,也可以用transform来填充,效果相同:

df['name'] = df.groupby('id')['name'].transform(lambda x: x.fillna(x.dropna().iloc[0]))
df['start_date'] = df.groupby('id')['start_date'].transform(lambda x: x.fillna(x.dropna().iloc[0]))

内容的提问来源于stack exchange,提问作者Jeff Oberlander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:29:52