如何基于字典值对DataFrame字段多条件校验,用对应字典键填充新列
问题错误分析
- 自定义函数逻辑错误:循环第一次迭代就触发
return,仅会判断字典第一个键值对的范围,其余范围永远不会被校验 np.select使用方式错误:np.select需要一次性传入全部条件列表和对应的全部取值列表完成多分支匹配,将其放在循环内单次调用完全不符合该函数的设计逻辑- 额外冗余问题:
apply逐行遍历属于行级操作,无法发挥numpy/pandas的向量化性能优势,属于不必要的性能浪费
正确实现方案
你需要支持动态字典条目、不需要写固定if判断的需求,直接基于val_dict批量生成条件列表和对应标签列表即可,不需要自定义函数和apply,性能和可读性都更好:
import pandas as pd import numpy as np # 示例数据 df = pd.DataFrame({"val":list(range(0,10,1))}) val_dict = {'label1':(0,1), 'label2':(2,4), 'label3':(5,7), 'label4':(8,10) } # 批量生成条件列表和标签列表,自动适配字典的条目数量 conditions = [] labels = [] for label, (low, high) in val_dict.items(): # pandas Series的布尔判断需要用&替代and,每个条件要加括号 conditions.append((df['val'] >= low) & (df['val'] <= high)) labels.append(label) # 调用np.select生成新列,default参数可自定义匹配不到范围时的默认值 df['label2'] = np.select(conditions, labels, default=np.nan)
如果你确实需要逐行处理的场景,也可以修正自定义函数的逻辑直接匹配,不需要搭配np.select:
def label_func(dct, x): for k, (low, high) in dct.items(): if low <= x <= high: return k return np.nan # 匹配不到的默认值 df['label2'] = df['val'].apply(lambda x: label_func(val_dict, x))
内容的提问来源于stack exchange,提问作者CreekGeek
相关产品推荐
相关产品推荐

