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
相关产品推荐
相关产品推荐

