如何基于指定分组列计算DataFrame中唯一值的Running Total?
解决方案
要实现按Name和Date分组,计算Total Fee唯一值的累计求和(Running Total),可以通过以下步骤用Pandas完成:
步骤说明
- 标记每个分组内
Total Fee的首次出现记录 - 仅保留首次出现的
Total Fee值,重复项设为0 - 对处理后的数值按分组做累计求和
完整代码
import pandas as pd # 构造示例DataFrame data = { 'Name': ['汤姆', '汤姆', '汤姆', '汤姆', '马特'], 'Product': ['香蕉', '苹果', '香蕉', '香蕉', '香蕉'], 'Date': ['2021-01-01', '2021-01-01', '2021-02-01', '2021-02-01', '2021-02-01'], 'Location': ['纽约', '纽约', '德克萨斯', '德克萨斯', '纽约'], 'Type': ['水果', '水果', '水果', '水果', '水果'], 'Sales': [120, 120, 420, 120, 30], 'Ship Fee %': [0.01, 0.01, 0.01, 0.01, 0.01], 'Total Fee': [1.2, 1.2, 4.2, 1.2, 0.3] } df = pd.DataFrame(data) # 标记分组内Total Fee的首次出现 df['is_first'] = df.groupby(['Name', 'Date'])['Total Fee'].transform(lambda x: ~x.duplicated()) # 生成临时列,仅保留首次出现的Fee值 df['temp_fee'] = df['Total Fee'].where(df['is_first'], 0) # 按分组计算累计和得到Running Total df['Running Total'] = df.groupby(['Name', 'Date'])['temp_fee'].cumsum() # 清理临时列 df.drop(['is_first', 'temp_fee'], axis=1, inplace=True) # 输出结果 print(df)
输出结果
| Name | Product | Date | Location | Type | Sales | Ship Fee % | Total Fee | Running Total |
|---|---|---|---|---|---|---|---|---|
| 汤姆 | 香蕉 | 2021-01-01 | 纽约 | 水果 | 120 | 0.01 | 1.2 | 1.2 |
| 汤姆 | 苹果 | 2021-01-01 | 纽约 | 水果 | 120 | 0.01 | 1.2 | 1.2 |
| 汤姆 | 香蕉 | 2021-02-01 | 德克萨斯 | 水果 | 420 | 0.01 | 4.2 | 4.2 |
| 汤姆 | 香蕉 | 2021-02-01 | 德克萨斯 | 水果 | 120 | 0.01 | 1.2 | 5.4 |
| 马特 | 香蕉 | 2021-02-01 | 纽约 | 水果 | 30 | 0.01 | 0.3 | 0.3 |
内容的提问来源于stack exchange,提问作者pipocaDourada
相关产品推荐
相关产品推荐

