Pandas如何按多条件筛选source_system为I的行及符合要求的前一行
问题解决:Pandas按分组筛选符合条件的行
问题分析
原代码无法得到预期结果主要有两个问题:
- 列名不匹配:数据集实际列名为
source_system和r_diff,原代码误用了不存在的visit_source_value、diff列 - 逻辑不符合需求:原代码没有绑定
source_system的关联判断,仅单纯判断r_diff数值,会误选大量不符合要求的行
正确实现代码
import pandas as pd import numpy as np # 构造测试数据集(和你提供的样例一致) df = pd.DataFrame({ 'person_id': [1,1,1,1,2,2,2,2,2,2,2,2,2], 'source_system': ['O','O','O','O','O','I','O','O','I','O','O','O','I'], 'r_diff': [np.nan, 0,9,np.nan,574,20,135,0,21,2,0,0,12] }) # 构建筛选掩码 # 掩码1:满足条件1,所有source_system为I的行 m1 = df['source_system'] == 'I' # 掩码2:满足条件2,按person_id分组后,当前行是O、r_diff为0、且下一行是I的行 m2 = ( (df['source_system'] == 'O') & (df['r_diff'] == 0) & (df.groupby('person_id')['source_system'].shift(-1) == 'I') ) # 合并掩码筛选行 result = df[m1 | m2].reset_index(drop=True) print(result)
输出结果
person_id source_system r_diff 0 2 I 20.0 1 2 O 0.0 2 2 I 21.0 3 2 O 0.0 4 2 I 12.0
逻辑说明
用groupby('person_id')['source_system'].shift(-1)取分组内下一行的系统标识,刚好对应你要求的「I行的前一行」的判断逻辑,同时绑定当前行必须是O且r_diff为0的条件,完全匹配需求。空值NULL在r_diff==0的判断中会自动返回False,不会被误选。
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

