在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
相关产品推荐
相关产品推荐

