Python中无需罗列分箱值、不使用np.digitize的分箱实现方法
分箱需求实现方案
你可以根据分箱的生成规则和技术栈需求选以下两种方案:
按规则生成分箱边界,避免逐个手写
你给出的分箱步长是可枚举的,直接通过步长累加生成边界即可,不用把所有边界值挨个写死在代码里:
start = 4100000 # 只需要定义每两个相邻边界的差,不用写完整边界值 step_list = [55304, 55304, 110608, 221216, 442433, 342668, 342668, 76016, 126892, 126891] bins = [start] for step in step_list: bins.append(bins[-1] + step)
如果你的分箱本身是等距、等频、指数分箱这类通用规则,还可以直接用对应API生成边界,连步长都不用手动定义。
不使用np.digitize的分箱实现
方案1:用pandas的cut方法(适合处理批量数组)
返回的索引和np.digitize结果完全一致:
import pandas as pd # include_lowest=True保证左闭右开的区间逻辑和np.digitize默认逻辑对齐,加1是因为cut默认从0开始编号 bin_indices = pd.cut(bins_array, bins=bins, labels=False, include_lowest=True) + 1
方案2:纯Python实现(无numpy/pandas依赖)
用内置bisect模块就能实现,性能也足够应对大部分场景:
import bisect # 单个值分箱 def get_bin(x): return bisect.bisect_right(bins, x) # 批量处理数组 bin_indices = [get_bin(x) for x in bins_array]
内容的提问来源于stack exchange,提问作者Preston B.
相关产品推荐
相关产品推荐

