如何在Pandas中按指定范围累加时保留Quantity列初始值?
问题:保留Quantity列初始值的同时计算Inventory累加值
原始DataFrame:
Part Quantity Inventory AAA -1 8 AAA -1 NaN AAA -5 NaN AAA 10 NaN AAA -3 NaN BBB 5 8 BBB -3 NaN BBB -3 NaN BBB 5 NaN BBB -3 NaN
原代码通过修改Quantity列实现Inventory的累加计算,导致每个分组的首个Quantity值被替换为Inventory初始值,丢失了原始数据。要解决这个问题,核心是避免修改原始Quantity列,改用临时列承载计算逻辑:
修改后的代码
# 创建临时列用于计算,保留原始Quantity数据不变 df['_temp_quantity'] = df['Quantity'] # 仅在临时列中替换Inventory非空行的值为对应Inventory初始值 df.loc[~df['Inventory'].isna(), '_temp_quantity'] = df['Inventory'] # 按Inventory非空行的累计出现次数划分计算分组 mask = ~df['Inventory'].isna() group = mask.cumsum() # 基于临时列的分组累加结果更新Inventory列 df['Inventory'] = df.groupby(group)['_temp_quantity'].cumsum() # 清理临时计算列 df.drop('_temp_quantity', axis=1, inplace=True)
运行后结果:
Part Quantity Inventory AAA -1 8 AAA -1 7 AAA -5 2 AAA 10 12 AAA -3 9 BBB 5 8 BBB -3 5 BBB -3 2 BBB 5 7 BBB -3 4
逻辑说明
- 新增临时列
_temp_quantity完全复制原始Quantity数据,所有计算操作仅在临时列上执行,确保原始数据不受影响 - 仅将临时列中
Inventory非空行的值替换为对应Inventory值,作为该分组累加的起始点 - 按
Inventory非空行的累计计数分组,对每个分组的临时列做累加计算,结果直接赋值给Inventory列 - 计算完成后删除临时列,得到保留原始
Quantity的最终结果
内容的提问来源于stack exchange,提问作者Prmake
相关产品推荐
相关产品推荐

