Pandas基于多条件筛选行:寻求更简洁的分组筛选方案
解决方案
方法1:映射字典+合并筛选(高效易维护)
先定义规则映射,生成每个分组的目标kind_sco,再和原表合并筛选,这种向量化操作性能最优,且规则变更时只需修改字典:
# 定义stat到目标kind_sco的映射 stat_target = {'h': 3, 'm': 1, 'l': 2} # 生成每个id+stat对应的目标值(去重避免重复计算) targets = data[['id_employee', 'stat']].drop_duplicates() targets['target_kind'] = targets['stat'].map(stat_target) # 合并后筛选匹配行 result = data.merge(targets, on=['id_employee', 'stat']) result = result[result['kind_sco'] == result['target_kind']].drop(columns=['target_kind'])
方法2:groupby+自定义筛选函数(逻辑直观)
直接按分组应用自定义筛选逻辑,完全贴合你原本的分组思路,适合规则更复杂的场景:
def pick_row(group): stat_val = group['stat'].iloc[0] if stat_val == 'h': return group[group['kind_sco'] == 3] elif stat_val == 'm': return group[group['kind_sco'] == 1] else: return group[group['kind_sco'] == 2] # group_keys=False避免保留分组索引 result = data.groupby(['id_employee', 'stat'], group_keys=False).apply(pick_row)
方法3:向量化条件判断(优化原写法)
用np.select把多条件逻辑整合成更清晰的形式,比原写法更易读,同样是向量化操作:
import numpy as np conditions = [ data['stat'] == 'h', data['stat'] == 'm', data['stat'] == 'l' ] target_kinds = [3, 1, 2] data['target'] = np.select(conditions, target_kinds) result = data[data['kind_sco'] == data['target']].drop(columns=['target'])
如果规则后续需要扩展,方法1的映射字典修改成本最低;如果是非常复杂的分组内逻辑,方法2的自定义函数灵活性更高。
内容的提问来源于stack exchange,提问作者biyazelnut
相关产品推荐
相关产品推荐

