Pandas中按唯一week日期计算Revenue总和并新增列的问题
问题分析与解决方案
你的原代码存在几个关键问题,导致出现大量空值:
- 列名错误:代码中引用了不存在的
Total_spend列,原DataFrame对应的列是Revenue - 数据丢失:
drop_duplicates(['Revenue'])会删除大量重复Revenue的行,使得后续transform无法匹配原DataFrame的完整索引,从而产生空值 - 逻辑偏差:你实际需要的是按
Country分组,计算该国家下所有唯一Revenue值的总和,而非直接对分组内的Revenue求和(或错误去重后求和)
正确解决方案
方法一:使用groupby + transform直接生成列
通过transform结合自定义函数,为每个Country的所有行填充对应的唯一Revenue总和:
df['Total_revenue'] = df.groupby('Country')['Revenue'].transform(lambda x: x.unique().sum())
方法二:先统计再合并
先计算每个国家的唯一Revenue总和,再通过merge合并回原DataFrame:
# 计算每个国家的唯一Revenue总和 country_rev_total = df.groupby('Country')['Revenue'].apply(lambda x: x.unique().sum()).reset_index(name='Total_revenue') # 合并到原DataFrame df = df.merge(country_rev_total, on='Country', how='left')
执行上述任意一种方法后,你将得到期望的结果:
| week | co_week | Revenue | Country | Total_revenue |
|---|---|---|---|---|
| 19/09/2021 | 01/10/2021 | 120 | US | 135 |
| 19/09/2021 | 03/10/2021 | 120 | US | 135 |
| 19/09/2021 | 03/10/2021 | 120 | FR | 154 |
| 20/09/2021 | 05/10/2021 | 15 | US | 135 |
| 20/09/2021 | 06/10/2021 | 34 | FR | 154 |
内容的提问来源于stack exchange,提问作者Maikel Bastawrous
相关产品推荐
相关产品推荐

