【问题标题】:Changing a value in DataFrame where the same value met a condition and the previous value meets another condition更改 DataFrame 中的值,其中相同的值满足一个条件,而前一个值满足另一个条件
【发布时间】:2021-11-05 07:51:50
【问题描述】:

我正在尝试创建一个列,如果同一列中的前一个值满足条件,则该值必须成为前一个值。比如……

PREVIOUS col | CORRECT col
HW              HW
HW              HW
RF              RF
FW              FW
FW              FW
FWRF            FW
FW              FW 

如您所见,如果 PREVIOUS col 值为 == 'FW',则 'FWRF' 已更改为 'FW'。 我正在尝试让 [CORRECT col] 工作,但我遇到了问题。

这是我迄今为止尝试过的无济于事......

df['CORRECT col'] = df.loc[df['PREVIOUS col'].shift(-1) == 'FWRF', 'PREVIOUS col']

我还尝试创建“if”语句以使其正常工作,但情况更糟……但我仍在学习如何尽可能有效地使用 pandas。非常感谢您的帮助。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

根据您的描述有两种可能:

要么

  1. 您只需要检查之前的值是FW,就可以将当前值也更改为FW

  1. 您还需要检查当前值是否为FWRF 以及先前的值是否为FW 以将当前值更改为FW

对于情况1,可以使用.mask().shift(),如下:

df['CORRECT col'] = df['PREVIOUS col'].mask(df['PREVIOUS col'].shift() == 'FW', 'FW')

这里,我们使用.shift()获取PREVIOUS col的上一行值,并检查是否为FW,如果是,我们将当前行值也更改为FW使用.mask()(如果条件为 False,我们保持原来的值)。

结果:

print(df)

  PREVIOUS col CORRECT col
0           HW          HW
1           HW          HW
2           RF          RF
3           FW          FW
4           FW          FW
5         FWRF          FW
6           FW          FW

对于还想检查当前行值为FWRF的情况2,您可以稍作更改以添加检查,如下所示:

df['CORRECT col'] = df['PREVIOUS col'].mask((df['PREVIOUS col'] == 'FWRF') & (df['PREVIOUS col'].shift() == 'FW'), 'FW')

在这里,我们添加了检查 (df['PREVIOUS col'] == 'FWRF') 并将 & (and) 与条件 (df['PREVIOUS col'].shift() == 'FW') 一起使用,这样只有当两个条件都为真时,我们才会更改值。

样本数据的结果相同,但查看您的真实数据是否需要检查一个条件或两个条件才能发挥最佳效果。

【讨论】:

  • 非常感谢。我以前从未听说过 mask() 方法,而这正是我所缺少的。第二个选项是正确答案,很抱歉我的问题不够清楚。
  • 如果您想检查列中的“下一个”值是否有条件,那么您会使用 df['PREVIOUS col'].shift(-1) 吗?
  • @MichaelRay 没错,使用.shift(-1) 来检查“下一个”值。默认值(不提供数字参数)是.shift(1),用于获取“上一个”值。负数 -n 表示“下一个 n-th”值。
猜你喜欢
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2020-03-08
  • 1970-01-01
相关资源
最近更新 更多