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

pandas DataFrame如何按ID分组统一type列的异常/正常标记

实现方法

核心逻辑是按ID分组后判断每组是否存在abnormal取值,再将分组判断结果对齐到原表每一行即可,不需要写循环,pandas内置的groupby+transform可以直接实现。

步骤1:构造样例数据

先复现测试数据集:

import pandas as pd

df = pd.DataFrame({
    'ID': [1, 1, 1, 2, 2, 2],
    'type': ['normal', 'normal', 'abnormal', 'normal', 'normal', 'normal']
})

步骤2:核心处理代码

最易读的常规写法:

df['type'] = df.groupby('ID')['type'].transform(
    lambda col: 'abnormal' if col.eq('abnormal').any() else 'normal'
)

代码逻辑说明

  • groupby('ID')['type']:按ID列拆分数据,单独提取每个分组的type列做计算
  • transform:分组计算后的结果会按照原表的索引对齐返回,长度和原DataFrame完全一致,不需要额外做表合并操作
  • 组内判断规则:只要组内存在任意一个abnormal取值,整组所有行统一返回abnormal;组内无abnormal(即全为normal)时,统一返回normal

结果验证

运行上述代码后打印df,输出完全符合预期:

ID      type
0   1  abnormal
1   1  abnormal
2   1  abnormal
3   2    normal
4   2    normal
5   2    normal

大数据量优化写法

如果数据量在百万行以上,可以用下面的写法避免lambda的逐组调用开销,运行速度会提升明显:

is_abnormal = df['type'].eq('abnormal').groupby(df['ID']).transform('any')
df['type'] = is_abnormal.map({True: 'abnormal', False: 'normal'})

内容的提问来源于stack exchange,提问作者Eunsoo Ko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:39:17