Pandas按三列分类分组条件填充第四列的实现方法
实现方案
核心逻辑是把条件判断转换为累计求和的计算项,用pandas原生向量化运算即可实现,不需要写自定义循环:
- 先修正一个描述笔误:从示例数据和计算规则看,判断是否扣减的字段是
C列(取值为YES/NO),不是B列,B列存储的是实际扣减数值。 - 构造扣减项列:当C列值为
NO时,扣减项等于当前行B列的值,否则扣减项为0 - 按A列分组,对扣减项做分组累计求和
- 用每组初始值400减去累计扣减额,就得到最终D列的值
代码实现
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'A': [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3], 'B': [5]*15, 'C': ['YES','YES','NO','NO','NO','NO','YES','YES','NO','YES','NO','NO','NO','NO','YES'] }) # 按规则计算D列 df['D'] = 400 - df.assign( deduct = df['B'].where(df['C'].eq('NO'), 0) ).groupby('A')['deduct'].cumsum()
运行后生成的D列和给出的示例结果完全一致。
逻辑验证
以A=2的分组为例:
- 第6行C=NO,扣减5,累计扣减5 → 400-5=395
- 第7、8行C=YES,扣减0,累计扣减保持5 → D值保持395
- 第9行C=NO,扣减5,累计扣减10 → 400-10=390
- 第10行C=YES,扣减0,累计扣减10 → D值保持390
完全匹配给出的逐行计算规则。
如果实际场景中确实是判断B列值为NO、用C列值做扣减,只需要把代码里判断列、取值列对应替换即可,核心逻辑通用。
内容的提问来源于stack exchange,提问作者vp_050
相关产品推荐
相关产品推荐

