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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:16:14