Pandas数据分箱的实现示例

 更新时间:2026年11月10日 11:49:37   作者:帅气的小女孩  
本文系统讲解pandas中两种核心数据分箱方法,详细讲解pd.cut和pd.qcut的用法与区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 pandas 中如何对数据进行分箱(也叫离散化)处理,这是数据预处理中非常常见的操作,用于将连续的数值型数据划分到不同的区间(箱子)中。

一、pandas 数据分箱的核心方法

pandas 主要通过 pd.cut() 和 pd.qcut() 两个函数实现分箱,我会分别介绍它们的用法和适用场景。

1. 等宽分箱(pd.cut ())

pd.cut() 是按数值区间宽度分箱,每个箱子的数值范围大小相等,适合数据分布相对均匀的场景。

示例代码:

import pandas as pd
import numpy as np
# 生成示例数据(10个0-100的随机数)
np.random.seed(42)  # 固定随机种子,结果可复现
data = pd.Series(np.random.randint(0, 101, size=10), name="score")
print("原始数据:")
print(data)
# 1. 基础等宽分箱:分成5个等宽区间
bins_1 = pd.cut(data, bins=5)
print("\n等宽分箱结果(默认区间标签):")
print(bins_1)
# 2. 自定义区间分箱:指定具体的分箱边界
bins = [0, 60, 70, 80, 90, 100]  # 自定义分数区间
labels = ["不及格", "及格", "良好", "优秀", "满分"]  # 对应区间的标签
bins_2 = pd.cut(data, bins=bins, labels=labels, include_lowest=True)  # include_lowest=True 包含左边界
print("\n自定义区间分箱结果(带标签):")
print(bins_2)
# 3. 统计每个箱子的数量
print("\n各分数段人数统计:")
print(bins_2.value_counts())

代码解释:

  • bins=5:自动将数据范围(0-100)分成 5 个等宽区间(0-20、20-40、…、80-100)。
  • bins=[0,60,70,80,90,100]:手动指定分箱的边界,适合业务场景明确的情况(如分数分级)。
  • labels:为每个区间设置易理解的标签,替代默认的区间字符串。
  • include_lowest=True:确保最小值(如 0)被包含在第一个区间中,避免边界值遗漏。

输出示例:

原始数据:
0    51
1    92
2    14
3    71
4    60
5    20
6    82
7    86
8    74
9    74
Name: score, dtype: int64
 
等宽分箱结果(默认区间标签):
0     (40.0, 60.0]
1    (80.0, 100.0]
2      (0.0, 20.0]
3     (60.0, 80.0]
4     (40.0, 60.0]
5      (0.0, 20.0]
6     (80.0, 100.0]
7     (80.0, 100.0]
8     (60.0, 80.0]
9     (60.0, 80.0]
Name: score, dtype: category
Categories (5, interval[int64, right]): [(0, 20] < (20, 40] < (40, 60] < (60, 80] < (80, 100]]
 
自定义区间分箱结果(带标签):
0    不及格
1     优秀
2    不及格
3     及格
4    不及格
5    不及格
6     良好
7     良好
8     及格
9     及格
Name: score, dtype: category
Categories (5, object): ['不及格' < '及格' < '良好' < '优秀' < '满分']
 
各分数段人数统计:
不及格    4
及格      3
良好      2
优秀      1
满分      0
Name: score, dtype: int64

2. 等频分箱(pd.qcut ())

pd.qcut() 是按数据分布频率分箱,每个箱子包含的样本数量大致相等,适合数据分布不均匀(如长尾分布)的场景。

示例代码:

# 沿用上面的data数据
# 1. 等频分箱:分成4个箱子,每个箱子样本数尽量相等
q_bins_1 = pd.qcut(data, q=4)
print("等频分箱结果(默认区间):")
print(q_bins_1)
# 2. 等频分箱+自定义标签
q_labels = ["低分段", "中低分段", "中高分段", "高分段"]
q_bins_2 = pd.qcut(data, q=4, labels=q_labels)
print("\n等频分箱结果(带标签):")
print(q_bins_2)
# 统计每个箱子的数量
print("\n各频段人数统计:")
print(q_bins_2.value_counts())

代码解释:

  • q=4:将数据按分位数分成 4 段(25%、50%、75%、100%),确保每个箱子的样本数尽可能接近。
  • 即使数据分布不均(比如大部分值集中在某个区间),qcut 也会按样本数量均分,而 cut 会按数值宽度均分(可能导致某些箱子样本数为 0)。

输出示例:

等频分箱结果(默认区间):
0     (35.5, 71.0]
1    (81.0, 92.0]
2    (13.999, 35.5]
3     (35.5, 71.0]
4     (35.5, 71.0]
5    (13.999, 35.5]
6    (81.0, 92.0]
7    (81.0, 92.0]
8     (71.0, 81.0]
9     (71.0, 81.0]
Name: score, dtype: category
Categories (4, interval[float64, right]): [(13.999, 35.5] < (35.5, 71.0] < (71.0, 81.0] < (81.0, 92.0]]
 
等频分箱结果(带标签):
0    中低分段
1    高分段
2    低分段
3    中低分段
4    中低分段
5    低分段
6    高分段
7    高分段
8    中高分段
9    中高分段
Name: score, dtype: category
Categories (4, object): ['低分段' < '中低分段' < '中高分段' < '高分段']
 
各频段人数统计:
低分段      2
中低分段    3
中高分段    2
高分段      3
Name: score, dtype: int64

二、关键注意事项

  1. 边界处理:pd.cut() 默认是左开右闭区间(如 (0,20]),如果需要左闭右开,可设置 right=False。
  2. 缺失值处理:如果数据中有 NaN,分箱后仍会保留 NaN,可通过 dropna=True 剔除,或提前用 fillna() 填充。
  3. 分箱结果类型:分箱后的结果是 category 类型,可通过 astype(str) 转为字符串,或 cat.codes 转为数值编码(如 0、1、2…)。

总结

  1. pd.cut():按数值宽度分箱,适合数据分布均匀的场景,支持自定义区间,是业务规则明确时的首选。
  2. pd.qcut():按样本数量分箱,每个箱子样本数大致相等,适合数据分布不均(如收入、销量)的场景。
  3. 分箱时可通过 labels 参数自定义标签,让结果更易理解,通过 value_counts() 统计各箱子的样本数

到此这篇关于Pandas数据分箱的实现示例的文章就介绍到这了,更多相关Pandas数据分箱内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论