Pandas如何实现ffill前向填充,直到另一列off条件触发时停止?
实现方案
核心思路是先标记每次状态切换的节点,再通过前向填充维持状态,遇到off信号时重置状态为0,全程使用向量化操作,性能优于逐行遍历的写法。
代码实现
import pandas as pd import numpy as np # 构造示例DataFrame d1 = {'on?': [0,1,0,0,0,1,0,0,0], 'off?': [0,0,0,1,0,0,0,0,0], 'value': [0,1,1,0,0,1,1,1,1]} df = pd.DataFrame(d1) # 核心逻辑 # 1. 标记状态切换点:on=1时设为1,off=1时设为0,其余位置留空 df['state'] = np.select( [df['on?'] == 1, df['off?'] == 1], [1, 0], default=np.nan ) # 2. 前向填充状态,初始空值填充为0 df['value'] = df['state'].ffill().fillna(0).astype(int) # 可选:删除临时生成的state列 df = df.drop('state', axis=1)
输出验证
运行代码后得到的value列和你给出的示例预期完全一致:
| index | on? | off? | value |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 1 |
| 2 | 0 | 0 | 1 |
| 3 | 0 | 1 | 0 |
| 4 | 0 | 0 | 0 |
| 5 | 1 | 0 | 1 |
| 6 | 0 | 0 | 1 |
| 7 | 0 | 0 | 1 |
| 8 | 0 | 0 | 1 |
注意事项
- 如果存在同一行
on?和off?同时为1的情况,可以调整np.select的条件顺序,靠前的条件优先级更高。 - 该方法为pandas原生向量化操作,性能远高于逐行遍历,适合处理百万行以上的大数据量DataFrame。
内容的提问来源于stack exchange,提问作者manwong0606
相关产品推荐
相关产品推荐

