基于Pandas Groupby按条件创建err_flag特征的技术问询
解决Pandas按ir_id分组生成err_flag的问题
核心思路
先按ir_id分组计算三个关键状态指标,再根据指标组合判断对应的err_flag——其中both_type是type1和type2的交集,需优先判断避免被单独类型覆盖。
实现步骤
1. 构造测试数据(含name5场景)
import pandas as pd data = pd.DataFrame({ 'ir_id': ['name1', 'name1', 'name2', 'name2', 'name3', 'name3', 'name4', 'name5', 'name5'], 'pli': [1, None, 2, 3, 4, 5, 6, 7, 8], 'pli_missing': ['no', 'yes', 'no', 'no', 'yes', 'yes', 'no', 'yes', 'no'], 'err_type': ['NORMAL', 'UNKNOWN', 'UNKNOWN', 'NORMAL', 'NORMAL', 'NORMAL', 'NORMAL', 'UNKNOWN', 'UNKNOWN'] })
2. 计算分组状态指标
用groupby.transform直接为每行标记所属分组的状态,无需额外合并操作:
# 分组内是否存在err_type=UNKNOWN且pli_missing=yes的行 data['has_unknown_yes'] = data.groupby('ir_id').apply( lambda g: ((g['err_type'] == 'UNKNOWN') & (g['pli_missing'] == 'yes')).any() ).transform('first') # 分组内是否存在err_type=UNKNOWN且pli_missing=no的行 data['has_unknown_no'] = data.groupby('ir_id').apply( lambda g: ((g['err_type'] == 'UNKNOWN') & (g['pli_missing'] == 'no')).any() ).transform('first') # 分组内无UNKNOWN且所有pli_missing都是no data['no_unknown_all_no'] = data.groupby('ir_id').apply( lambda g: (g['err_type'] != 'UNKNOWN').all() & (g['pli_missing'] == 'no').all() ).transform('first')
3. 生成err_flag
按规则优先级判断,优先处理both_type:
def get_err_flag(row): if row['has_unknown_yes'] and row['has_unknown_no']: return 'both_type' elif row['has_unknown_yes']: return 'type1' elif row['has_unknown_no']: return 'type2' elif row['no_unknown_all_no']: return 'type3' else: return None # 处理未覆盖的边缘场景,可自定义标记 data['err_flag'] = data.apply(get_err_flag, axis=1)
4. 查看结果
print(data[['ir_id', 'err_type', 'pli_missing', 'err_flag']])
输出中name5会被正确标记为both_type,符合需求。
关键注意事项
- 必须基于分组整体状态判断,而非逐行判断,确保
err_flag是组级特征的映射。 - 优先级顺序不可颠倒:
both_type需先于type1/type2判断,否则会被单独类型覆盖。
内容的提问来源于stack exchange,提问作者fast_crawler
相关产品推荐
相关产品推荐

