使用 pandas 到 select 滞后行以及基于条件的当前行
Use pandas to select the lagged row along with current row based on criteria
我有一个如下所示的数据框
person_id source_system r_diff
1 A NULL
1 B 0
1 B 9
1 A 15
1 A 574
1 B 0
1 A 63
1 A 136
1 B 0
我想select数据基于2条规则的Or运算
a) Select 所有 source_system = B
的记录
b) Select n 和 n-1 行,其中 r_diff = 0.
例如,在上面的数据中,您可以找到第 2、6、9 行的 r_diff = 0。所以,我想 select 行 1,2 和 5,6 和 8,9。你可以看到我是如何选择 n 和 n-1 行的
我尝试了以下
df['flag_1'] = np.where((df['source_system'] == 'B'), '1','0')
df['flag_2'] = np.where((df['r_diff'] == 0), '1','0')
df['flag_3'] = np.where((df['r_diff'].shift(-1) == 0, '1','0')
df = df[((df['flag_1'] == '1') or (df['flag_2'] == '1') or (df['flag_3'] == '1'))]
我希望我的输出如下所示
person_id source_system r_diff
1 A NULL
1 B 0
1 B 9
1 A 574
1 B 0
1 A 136
1 B 0
我认为你很接近,你可以通过 |
将掩码设置为变量并按位 OR
链接,例如:
m1 = df['source_system'] == 'B'
m2 = df['r_diff'] == 0
m3 = df.groupby('person_id')['r_diff'].shift(-1) == 0
df = df[m1 | m2 | m3]
print (df)
person_id source_system r_diff
0 1 A NaN
1 1 B 0.0
2 1 B 9.0
4 1 A 574.0
5 1 B 0.0
7 1 A 136.0
8 1 B 0.0
我有一个如下所示的数据框
person_id source_system r_diff
1 A NULL
1 B 0
1 B 9
1 A 15
1 A 574
1 B 0
1 A 63
1 A 136
1 B 0
我想select数据基于2条规则的Or运算
a) Select 所有 source_system = B
的记录b) Select n 和 n-1 行,其中 r_diff = 0.
例如,在上面的数据中,您可以找到第 2、6、9 行的 r_diff = 0。所以,我想 select 行 1,2 和 5,6 和 8,9。你可以看到我是如何选择 n 和 n-1 行的
我尝试了以下
df['flag_1'] = np.where((df['source_system'] == 'B'), '1','0')
df['flag_2'] = np.where((df['r_diff'] == 0), '1','0')
df['flag_3'] = np.where((df['r_diff'].shift(-1) == 0, '1','0')
df = df[((df['flag_1'] == '1') or (df['flag_2'] == '1') or (df['flag_3'] == '1'))]
我希望我的输出如下所示
person_id source_system r_diff
1 A NULL
1 B 0
1 B 9
1 A 574
1 B 0
1 A 136
1 B 0
我认为你很接近,你可以通过 |
将掩码设置为变量并按位 OR
链接,例如:
m1 = df['source_system'] == 'B'
m2 = df['r_diff'] == 0
m3 = df.groupby('person_id')['r_diff'].shift(-1) == 0
df = df[m1 | m2 | m3]
print (df)
person_id source_system r_diff
0 1 A NaN
1 1 B 0.0
2 1 B 9.0
4 1 A 574.0
5 1 B 0.0
7 1 A 136.0
8 1 B 0.0