基于Pandas的多条件测试结果分组判定方法咨询
Pandas 多测试项按ID批量判定场景的函数推荐
需求说明
有包含重复ID的测试数据,需完成两个核心任务:
- 给每行的测试值标注
(OK)或(Fail) - 按ID判定:若该ID的所有测试项至少通过一次,整体标记为"OK";否则标记为"Fail"
原始DataFrame
| ID | test 1 | test 2 | test 3 |
|---|---|---|---|
| A | 5 | 3 | 8 |
| B | 3 | 7 | 9 |
| A | 7 | 3 | 4 |
| A | 1 | 8 | 0 |
| B | 6 | 3 | 7 |
预期输出
每行测试值追加判定标记,同时最终ID整体判定:
| ID | test 1 | test 2 | test 3 |
|---|---|---|---|
| A | 5 (OK) | 3 (Fail) | 8 (Fail) |
| A | 7 (Fail) | 3 (OK) | 4 (Fail) |
| A | 1 (OK) | 8 (OK) | 0 (OK) |
| B | 6 (OK) | 3 (OK) | 7 (Fail) |
| B | 3 (Fail) | 7 (OK) | 9 (Fail) |
- ID A:所有测试项至少通过一次 → 整体"OK"
- ID B:test 3从未通过 → 整体"Fail"
适用Pandas函数推荐
以下函数可高效实现需求,替代手动遍历:
groupby('ID'):按ID分组,直接聚合同ID的所有行,是批量处理的核心基础,无需手动检查重复值。transform():配合groupby使用,能在保留原始DataFrame行结构的前提下,将分组计算结果映射到每一行。例如可以标记当前行所属ID是否在某测试项有过通过记录。agg()/aggregate():分组后对每个测试项做聚合计算,比如用lambda x: any(x >= 阈值)判断该ID的某测试项是否至少有一次通过,快速得到各ID的测试项通过情况。apply():用于自定义逻辑处理(比如给测试值拼接(OK)/(Fail)字符串),可针对单行或单列灵活实现标注逻辑。merge():将分组得到的ID整体判定结果,关联回原始标注后的DataFrame,快速整合最终结果。
对应步骤的函数应用示例
- 按ID聚合:直接用
df.groupby('ID')替代手动筛选重复ID行 - 标注每行测试结果:对测试列用
apply执行自定义判定,如df['test 1'] = df['test 1'].apply(lambda x: f"{x} (OK)" if x <=5 else f"{x} (Fail)") - 判定ID整体合格性:通过
groupby('ID').agg({'test 1': lambda x: any(x <=5), 'test 2': ..., 'test 3': ...})得到各测试项的通过状态,再用all(axis=1)判断是否所有测试项都满足至少通过一次,最终生成ID的整体标记。
内容的提问来源于stack exchange,提问作者min chul
相关产品推荐
相关产品推荐

