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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:32:49