You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Pandas中,当列值为yes时如何将前一行值与当前行值匹配?

没问题!咱们先分析下你原来的代码为什么没达到预期:你把"yes"替换成NaN然后用bfill(),这会让后面的非yes值被前面的yes填充,但你需要的是当前行是yes时,把前一行改成yes,方向正好反了~

接下来,你想要结合np.where和bfill实现需求,完全可以!这里给你两种思路,其中第二种就是你要的组合方式:

方法1:直接用np.where标记目标行

这种方法最直观,我们只需要判断两个条件:

  • 当前行的val本身就是"yes"
  • 当前行的下一行是"yes"(因为下一行是yes的话,当前行需要被改成yes)

把满足任一条件的行设为"yes",其余保留原值即可:

import numpy as np
import pandas as pd

# 你的原始数据
df = pd.DataFrame({'ID': [1,2,3,4,5], 'val': ['0.0', 'yes', '1.0', '0.0', 'yes']})

# 标记需要设为"yes"的行:当前行是yes 或者 下一行是yes
mask = (df['val'] == 'yes') | (df['val'].shift(-1) == 'yes')
df['val'] = np.where(mask, 'yes', df['val'])

print(df)

输出正好是你要的结果:

ID   val
0   1   yes
1   2   yes
2   3  1.0
3   4   yes
4   5   yes

方法2:结合np.where和bfill实现

如果你一定要用bfill,可以先把需要被改成yes的行(也就是下一行是yes的非yes行)设为NaN,然后用bfill()从后面的"yes"填充这些NaN:

import numpy as np
import pandas as pd

df = pd.DataFrame({'ID': [1,2,3,4,5], 'val': ['0.0', 'yes', '1.0', '0.0', 'yes']})

# 步骤1:用np.where把"下一行是yes的非yes行"设为NaN
df['val'] = np.where(
    (df['val'] != 'yes') & (df['val'].shift(-1) == 'yes'),
    np.nan,
    df['val']
)

# 步骤2:用bfill()填充NaN,再转成字符串类型
df['val'] = df['val'].bfill().astype(str)

print(df)

这个逻辑是:先把需要被修改的行(ID1、ID4)变成NaN,然后bfill()会用它们后面的"yes"(ID2、ID5)来填充NaN,最后转成字符串就得到了预期结果。

两种方法都能完美实现你的需求,你可以根据自己的习惯选择~

内容的提问来源于stack exchange,提问作者code_learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:22:40