将多个条件应用于 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
我有一个如下所示的数据框
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