You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:45:03