如何用Pandas筛选未在test_2测试中失败的用户?
解决方法:筛选未在test_2测试中失败的用户
首先明确核心需求:我们要保留的用户是没有在test_2中得到fail结果的——包含两种情况:要么用户没参加test_2,要么参加了test_2但结果不是fail(比如pass、pd.NA)。
你的代码问题分析
- 第一段代码
df.groupby('name').filter(lambda x : ((x.result != 'fail')).all()):要求用户所有测试的结果都不能是fail,这把test_3失败的emma也错误过滤了,不符合需求。 - 第二段代码
df.groupby('name').filter(lambda x : ((x.test == 'test_2') & (x.result != 'fail')).all()):逻辑错误,all()要求组内每一行都满足“是test_2且结果不是fail”,但很多用户没有test_2的测试记录,这些行的条件判断为False,最终all()返回False,导致这些用户被错误过滤。
正确实现方式
方式一:使用groupby.filter的正确逻辑
我们只需要检查每个用户组中是否不存在“test_2且result为fail”的记录,用~any()实现即可:
df_filtered = df.groupby('name').filter(lambda x: ~((x['test'] == 'test_2') & (x['result'] == 'fail')).any())
逻辑拆解:
(x['test'] == 'test_2') & (x['result'] == 'fail'):定位组内test_2且失败的记录.any():判断组内是否存在这类记录~:取反,即组内不存在这类记录,符合我们的筛选要求
方式二:先排除不合格用户,再过滤数据
先提取所有在test_2中失败的用户名单,再保留不在该名单里的用户,这种方式更直观,大数据量下性能更优:
# 提取test_2失败的用户名单 failed_test2_users = df[(df['test'] == 'test_2') & (df['result'] == 'fail')]['name'].unique() # 过滤掉这些用户 df_filtered = df[~df['name'].isin(failed_test2_users)]
验证结果
执行后,保留的用户为nick、liam、jane、emma,完全符合预期:
- nick:无test_2记录
- liam:test_2结果为pd.NA
- jane:test_2结果为pass
- emma:test_2结果为pd.NA(test_3失败不影响筛选)
内容的提问来源于stack exchange,提问作者Daniel H
相关产品推荐
相关产品推荐

