Pandas实战问题:如何根据B列True/False值获取A列最后一个非NaN值
Pandas 需求实现解答
这个需求完全可以实现,经核对你文字描述的需求和你贴出的期望结果逻辑存在差异,我分别给出两种场景的实现代码:
前置准备:构造样例数据表
import pandas as pd import numpy as np df = pd.DataFrame({ "A": [754, None, None, None, None, 999, None, None, None, 875], "B": [False, False, False, False, True, False, False, True, False, False] })
方案1:匹配你文字描述的需求
需求逻辑:B列取值为True时,C列填入当前行之前A列的最后一个非NaN值,其余情况C列为NaN
实现代码:
# 生成每一行对应上方最近的A列非空值的辅助列 df["a_last_notna"] = df["A"].ffill() # 仅B列为True时赋值 df["C"] = np.where(df["B"], df["a_last_notna"], np.nan) # 删除辅助列 df.drop("a_last_notna", axis=1, inplace=True)
运行后结果:
| 索引 | A | B | C |
|---|---|---|---|
| 0 | 754 | False | NaN |
| 1 | None | False | NaN |
| 2 | None | False | NaN |
| 3 | None | False | NaN |
| 4 | None | True | 754 |
| 5 | 999 | False | NaN |
| 6 | None | False | NaN |
| 7 | None | True | 999 |
| 8 | None | False | NaN |
| 9 | 875 | False | NaN |
方案2:匹配你贴出的期望结果
需求逻辑:仅当前行A列非空且B列为False时,C列填入A列的值,其余情况C列为NaN
实现代码:
df["C"] = np.where(df["A"].notna() & ~df["B"], df["A"], np.nan)
运行后结果和你贴出的期望表完全一致:
| 索引 | A | B | C |
|---|---|---|---|
| 0 | 754 | False | 754 |
| 1 | None | False | NaN |
| 2 | None | False | NaN |
| 3 | None | False | NaN |
| 4 | None | True | NaN |
| 5 | 999 | False | 999 |
| 6 | None | False | NaN |
| 7 | None | True | NaN |
| 8 | None | False | NaN |
| 9 | 875 | False | NaN |
你可以根据自己的实际业务需求选择对应的实现方案即可。
内容的提问来源于stack exchange,提问作者User4545
相关产品推荐
相关产品推荐

