使用Pandas pivot_table求和时部分有数据列返回0的问题求助
问题分析与解决
原始数据
| id | name | start_date | clicks | conversions | installs | downloads |
|---|---|---|---|---|---|---|
| 101 | India | 2023-06-06 | 1 | 4 | 0 | NaN |
| 101 | India | 2023-06-06 | 2 | 5 | 0 | NaN |
| 101 | India | 2023-06-06 | 1 | 6 | 0 | NaN |
| 201 | Kenya | 2023-09-15 | 5 | 8 | 0 | NaN |
| 201 | Kenya | 2023-09-15 | 2 | 1 | 0 | NaN |
| 201 | NaN | NaN | NaN | NaN | NaN | 10 |
| 201 | NaN | NaN | NaN | NaN | NaN | 5 |
| 201 | NaN | NaN | NaN | NaN | NaN | 4 |
你的代码
pivot_df = pd.pivot_table( df, index=['id','name','start_date'], aggfunc={'clicks': 'sum','conversions': 'sum','installs': 'sum', 'downloads': 'sum'})
实际输出 vs 预期输出
实际输出
| id | name | start_date | clicks | conversions | installs | downloads |
|---|---|---|---|---|---|---|
| 101 | India | 2023-06-06 | 4 | 15 | 0 | 0 |
| 201 | Kenya | 2023-09-15 | 7 | 9 | 0 | 0 |
预期输出
| id | name | start_date | clicks | conversions | installs | downloads |
|---|---|---|---|---|---|---|
| 101 | India | 2023-06-06 | 4 | 15 | 0 | 0 |
| 201 | Kenya | 2023-09-15 | 7 | 9 | 0 | 19 |
问题原因
你设置的分组条件是['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
相关产品推荐
相关产品推荐

