将多个条件应用于 select 当前行和上一行 - Pandas

Apply multiple criteria to select current and prior row - Pandas

我有一个如下所示的数据框

person_id  source_system   r_diff
  1              O          NULL
  1              O           0
  1              O           9
  1              O           NULL
  2              O           574
  2              I           20
  2              O           135
  2              O           0
  2              I           21
  2              O           2
  2              O           0
  2              O           0
  2              I           12 

我想要 select 行基于以下条件

条件 1 - 选择源系统 = I

的所有行

条件 2 - 仅当第 (n-1) 的源系统为 O 且 diff 为零时才选择前行 (n-1)。

仅当第 n 行的源系统 = I 时才应应用条件 2。如果第 (n-1) 个源系统是 I,我们不需要做任何事情,因为标准 1 会处理它。

我们必须对每个人应用这两个标准

我根据 SO 的建议尝试了以下方法,但不确定如何让它工作

m1 = df['visit_source_value'] == 'I'
m2 = df['diff'] <= 0
m3 = df.groupby('person_id')['diff'].shift(-1) <= 0 

df = df1[m1 | m2 | m3]

我希望我的输出如下所示

  2              I           20
  2              O           0
  2              I           21
  2              O           0
  2              I           12 

你可以一行完成:

>>> df[df['source_system'].eq('I') | (df['source_system'].shift(-1).eq('I') & df['r_diff'].le(0))]
    person_id source_system  r_diff
5           2             I    20.0
7           2             O     0.0
8           2             I    21.0
11          2             O     0.0
12          2             I    12.0
>>> 

我不喜欢一行解决方案,因为如果代码更复杂则难以阅读,所以最好使用:

m1 = df['visit_source_value'] == 'I'
m2 = df['r_diff'] <= 0
m3 = df.groupby('person_id')['visit_source_value'].shift(-1) == 'I'

df = df[m1 | (m2 & m3)]

print (df)
    person_id visit_source_value  r_diff
5           2                  I    20.0
7           2                  O     0.0
8           2                  I    21.0
11          2                  O     0.0
12          2                  I    12.0