如何基于自定义列表为pandas DataFrame列动态生成数值区间分类
基于动态阈值列表对pandas列进行区间分类的实现方案
首先说明你原有固定函数的逻辑问题:你使用了两个独立的if判断而非elif,导致大于90的值会被后续的else分支覆盖为< 50,以下方案同时适配动态阈值需求和你给出的示例结果。
方案1:自定义动态匹配函数(适配原有逻辑写法)
直接改造分类函数,支持传入动态阈值列表,逻辑可灵活调整,适合小数据量场景:
import pandas as pd rangelist=[90,70,50] data = {'Result': [75,85,95,45,76,8,10,44,22,65,35,67]} sampledf=pd.DataFrame(data) def dynamic_cat(value, range_list): # 阈值按从高到低排序,适配任意顺序的输入列表 sorted_range = sorted(range_list, reverse=True) # 匹配70-90区间,可根据实际需要的区间数量调整 if sorted_range[1] < value < sorted_range[0]: return f"{sorted_range[0]}-{sorted_range[1]}" # 所有未匹配到的数值统一归为小于最低阈值分类 return f"< {sorted_range[-1]}" sampledf['category'] = sampledf['Result'].apply(dynamic_cat, range_list=rangelist)
运行后输出和你给出的示例结果完全一致。如果需要增加70-50这类更多区间分类,可调整为全区间匹配版本:
def dynamic_cat_full(value, range_list): sorted_range = sorted(range_list, reverse=True) for i in range(len(sorted_range)-1): upper = sorted_range[i] lower = sorted_range[i+1] if lower < value < upper: return f"{upper}-{lower}" return f"< {sorted_range[-1]}"
方案2:使用pandas内置pd.cut分箱(性能更高,适合大数据量)
pd.cut是pandas专门用于区间分箱的工具,比apply遍历效率高很多,尤其适合十万行以上的数据集:
# 阈值升序排列 sorted_asc = sorted(rangelist) # 定义分箱边界,0和100可根据实际数值范围调整为float('inf')/float('-inf') bins = [0] + sorted_asc + [100] # 自定义对应区间的标签,不需要的分类统一设为<最低阈值 labels = [f"< {sorted_asc[0]}"] * 2 + ["90-70", "100-90"] # 分箱,right=True表示区间左开右闭,符合 (a,b] 的判断规则,可按需调整 sampledf['category'] = pd.cut(sampledf['Result'], bins=bins, labels=labels, right=True)
内容的提问来源于stack exchange,提问作者DD08
相关产品推荐
相关产品推荐

