Pandas如何非循环新增依赖上一行列值的DataFrame列
Pandas无循环实现按规则逐行填充新增列
你描述的填充逻辑不需要写显式Python循环,直接用Pandas内置的向量化操作就能实现,运行效率远高于逐行循环,尤其适合大数据量场景。
实现思路
核心逻辑拆成两步即可完全匹配三条填充规则:
- 先标记所有需要直接取当前行
Value的行:包括从未出现过Dummy_Variable=1的前置行,以及当前行Dummy_Variable=1的行,其余行先设为空值 - 对空值做向前填充(ffill),自动继承上一行的
Placeholder取值,覆盖剩余规则场景
完整实现代码
import pandas as pd # 构造原始DataFrame data = {'Value': [1000, 1020, 1011, 1010, 1030, 950, 1001, 1100, 1121, 1131], 'Dummy_Variable': [0,0,1,0,0,0,1,0,1,1] } df = pd.DataFrame(data) # 计算Dummy_Variable的累计和,判断是否已经出现过值为1的行 cumsum_dummy = df['Dummy_Variable'].cumsum() # 第一步:给需要直接取当前Value的行赋值 df['Placeholder'] = df['Value'].where( (cumsum_dummy == 0) | (df['Dummy_Variable'] == 1) ) # 第二步:向前填充空值,匹配0值行继承上一行结果的规则,最后转整数和预期格式对齐 df['Placeholder'] = df['Placeholder'].ffill().astype(int) # 输出结果验证 print(df)
逻辑对应说明
- 规则1(当前行之前所有Dummy_Variable均为0时取当前Value):通过
cumsum_dummy == 0判断,累计和为0代表从第一行到当前行从未出现过Dummy=1,直接取当前Value - 规则2(当前行Dummy_Variable为1时取当前Value):通过
df['Dummy_Variable'] == 1判断,直接取当前Value - 规则3(当前行Dummy为0且上一行Placeholder大于0时取上一行值):这部分行在第一步赋值时为空,
ffill()会自动沿用上一行最近的非空Placeholder值,完全符合要求
运行代码后得到的结果和给出的预期DataFrame完全一致。
内容的提问来源于stack exchange,提问作者BGG16
相关产品推荐
相关产品推荐

