Python中如何按分组执行递归计算并应用于pandas DataFrame
解决pandas分组逐行迭代计算需求
实现思路
你需要的是分组内依赖前序计算结果的迭代运算,直接使用groupby.apply配合自定义迭代函数即可实现,不需要写多层循环。
要注意先对每个分组按年份升序排序,避免原始数据顺序混乱导致计算错误。
完整实现代码
1. 导入依赖并构造示例数据
import pandas as pd # 注意pandas的DataFrame首字母需要大写,修正原示例的拼写错误 df = pd.DataFrame({ 'Product ID':['A','A','A','A','B','B','C'], 'Year':[1,2,3,4,1,2,1], 'Cumulative Profit':[10,8,12,18,-5,10,2], 'Desired output':[10,0,2,6,0,10,2] })
2. 定义分组内计算函数
def calc_value(group): # 先按年份排序保证时序正确 group = group.sort_values('Year').reset_index(drop=True) value_list = [] sum_prev_value = 0 for idx, row in group.iterrows(): if idx == 0: current_val = max(row['Cumulative Profit'], 0) else: current_val = max(0, row['Cumulative Profit'] - sum_prev_value) value_list.append(current_val) sum_prev_value += current_val group['value'] = value_list return group
3. 分组应用函数得到结果
result = df.groupby('Product ID', group_keys=False).apply(calc_value) print(result)
结果验证
运行后得到的value列和你给出的Desired output完全一致:
| Product ID | Year | Cumulative Profit | Desired output | value |
|---|---|---|---|---|
| A | 1 | 10 | 10 | 10 |
| A | 2 | 8 | 0 | 0 |
| A | 3 | 12 | 2 | 2 |
| A | 4 | 18 | 6 | 6 |
| B | 1 | -5 | 0 | 0 |
| B | 2 | 10 | 10 | 10 |
| C | 1 | 2 | 2 | 2 |
内容的提问来源于stack exchange,提问作者windvanish
相关产品推荐
相关产品推荐

