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

如何基于自定义列表为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:54:08