如何在DataFrame中为满足Condition2的行填充最近Condition1对应值?
问题:基于条件填充最近匹配的前序值
我有如下DataFrame:
| Index | Value | Condition1 | Condition2 |
|---|---|---|---|
| 1 | 1 | True | False |
| 2 | 5 | False | False |
| 3 | 3 | False | True |
| 4 | 3 | False | False |
| 5 | 3 | True | False |
| 6 | 6 | False | True |
我希望检测Condition2为True的行,在新列中填充之前最近一行Condition1为True的Value值。期望输出如下:
| Index | Value | Condition1 | Condition2 | New Column |
|---|---|---|---|---|
| 1 | 1 | True | False | None |
| 2 | 5 | False | False | None |
| 3 | 3 | False | True | 1 |
| 4 | 3 | False | False | None |
| 5 | 3 | True | False | None |
| 6 | 6 | False | True | 3 |
我尝试用np.where()结合tail()实现,但代码出现语法错误:
df["New Column"] = np.where(df["Condition 2"]==True,df[df["Condition 1"]==True].["Value"].tail(1),None)
由于DataFrame可能很大,我希望用非循环的方式实现需求。
解决方案
可以通过矢量化操作高效实现,步骤如下:
- 生成一个序列,仅保留
Condition1为True时的Value,其余设为NaN,再通过向前填充(ffill())让每一行继承最近的前序有效Value - 仅在
Condition2为True的行保留上述填充后的值,其余行设为None
具体代码
import pandas as pd import numpy as np # 生成最近Condition1为True的Value的向前填充序列 last_true_value = df['Value'].where(df['Condition1']).ffill() # 按Condition2筛选填充新列 df['New Column'] = np.where(df['Condition2'], last_true_value, None)
代码说明
df['Value'].where(df['Condition1']):仅保留Condition1为True行的Value,其余行转为NaN.ffill():向前填充NaN,确保每一行都能获取到最近的前序Condition1为True的Valuenp.where(df['Condition2'], last_true_value, None):根据Condition2的布尔值,决定填充对应值还是None
该方法全程为矢量化操作,无循环,处理大型DataFrame时效率优异。
内容的提问来源于stack exchange,提问作者Akav
相关产品推荐
相关产品推荐

