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

如何基于频率对数据分箱以实现数据均匀分布?

基于频率实现数据均匀分箱的方法

嘿,这个问题我熟!等频分箱(也就是你说的基于频率的分箱)就是解决数据均匀分布分箱的完美方案,我给你一步步拆解怎么做,还附上实用的代码示例:

核心思路

等频分箱的目标是让每个分箱内包含的样本数量尽可能相等,这样就能避免出现某个区间数据扎堆、另一个区间空空如也的情况,让数据分布更均匀。

手动分箱步骤(适合小数据集)

你的原始数据是:89, 54, 45, 67, 78, 80,总共6个数据,想要每个区间数量一致,按下面的步骤来:

  1. 先给数据排序
    分箱的前提是数据有序,把原始数据从小到大排列:
    45, 54, 67, 78, 80, 89

  2. 确定分箱数量与单箱样本数
    总数据量是6,如果你期望每个区间有2个样本,那直接分成 6 ÷ 2 = 3 个箱就行(刚好是整数倍,非常省心)。如果数据量不是整数倍,通常会让首尾的箱稍微调整样本数,保证整体尽量均匀。

  3. 划分区间并统计数量
    按排序后的顺序,每2个数据归为一组,用组内的最小值和最大值作为区间范围:

    • 第一组:45、54 → 区间 45 - 54,数量2
    • 第二组:67、78 → 区间 67 - 78,数量2
    • 第三组:80、89 → 区间 80 - 89,数量2
      这样就得到了你想要的均匀分布结果。

代码实现(适合大数据集)

如果你的数据量很大,手动分箱太麻烦,用Python的pandas库的qcut函数可以一键完成等频分箱,这是专门做这类分箱的工具:

import pandas as pd

# 原始数据
raw_data = [89, 54, 45, 67, 78, 80]
# 转换为pandas Series格式
data_series = pd.Series(raw_data)

# 执行等频分箱,分成3个箱,同时返回区间边界
bins_result, bin_edges = pd.qcut(data_series, q=3, retbins=True)

# 统计每个区间的样本数量,并按区间顺序排序
count_by_bin = bins_result.value_counts().sort_index()

# 输出成你想要的格式
print("Interval\tCount")
for interval, count in count_by_bin.items():
    # 把pandas的区间对象转换成"min - max"的字符串格式
    interval_str = f"{interval.left} - {interval.right}"
    print(f"{interval_str}\t{count}")

运行这段代码后,输出结果和你期望的完全一致:

Interval	Count
45 - 54		2
67 - 78		2
80 - 89		2

注意事项

  • 如果数据量不是分箱数的整数倍,qcut会自动调整区间范围,让每个箱的样本数尽可能接近(比如7个数据分3箱,会有两个箱2个样本,一个箱3个样本)。
  • 区间的端点规则(比如是否包含左/右边界)可以通过qcut的参数调整,默认是左闭右开,如果你需要修改可以查一下官方文档的参数说明。

内容的提问来源于stack exchange,提问作者Nabih Bawazir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:18:19