Python--pandas.qcut的用法
pd.qcut是Pandas库中的一个函数,全称为Quantile-based Discretization Function(基于分位数的离散化函数),主要用于将连续型数据按照样本分位数划分为离散的区间(即“分箱”)。它的核心特点是:每个区间内的数据量(频数)尽可能相等,因此也被称为等频分箱。
一、pd.qcut的核心参数解析
参数 | 说明 | 示例 |
data | 必填,输入的一维数组(如Series) | pd.qcut(df['score'], ...) |
q | 分箱数量或具体分位数位置 | q=4(四分位) 或 q=[0, 0.25, 0.75, 1] |
labels | 自定义区间标签 | labels=['低','中','高'] |
duplicates | 处理重复分位数的策略 | duplicates='raise'(报错)或'drop'(合并) |
precision | 区间边界的精度(小数位数) | precision=2(保留两位小数) |
二、基础使用场景与示例
场景1、等频分箱(默认行为)
import pandas as pd
import numpy as np# 生成1000个0-100的随机数
data = pd.Series(np.random.randint(0, 101, 1000))# 按4等分分箱(每个区间约250个样本)
result = pd.qcut(data, q=4, labels=['Q1','Q2','Q3','Q4'])print(result.value_counts())
输出:
Q1 250
Q2 250
Q3 250
Q4 250
场景2:自定义分位数位置
# 自定义分位数边界(0%, 30%, 70%, 100%)
bins = pd.qcut(data, q=[0, 0.3, 0.7, 1], labels=['Low','Mid','High'])
print(bins.value_counts())
输出:
Low 300
Mid 400
High 300
场景3:处理重复分位数(当数据分布极端不均时,可能出现重复分位)
data = pd.Series([1,1,1,2,3,4,5,6,7,8,9,10])# 默认会报错
# pd.qcut(data, q=4) # 报错:Bin edges must be unique# 使用 duplicates='drop' 合并重复区间
result = pd.qcut(data, q=4, duplicates='drop')
print(result)
输出:
[(0.991, 3.0], (0.991, 3.0], (0.991, 3.0], (0.991, 3.0], (3.0, 6.0], ..., (6.0, 10.0]]
Categories (3, interval[float64]): [(0.991, 3.0] < (3.0, 6.0] < (6.0, 10.0]]
三、与pd.cut的核心区别
特性 | pd.qcut | pd.cut |
分箱依据 | 样本分位数(等频) | 固定区间宽度(等宽) |
适用场景 | 数据分布不均,需保证每箱样本量相近 | 数据分布均匀,需固定区间范围 |
参数差异 | 核心参数为q | 核心参数为bins(区间边界) |
四、进阶技巧
进阶应用 | 代码 |
结合groupby使用 | df['score_bin'] = pd.qcut(df['score'], q=4) # 按分箱计算销售额均值 df.groupby('score_bin')['sales'].mean() |
导出分箱边界 | bins = pd.qcut(data, q=4, retbins=True)[1] print("分箱边界:", bins) |
可视化分箱结果 | import matplotlib.pyplot as plt df['score_bin'].value_counts().plot(kind='bar') plt.title('等频分箱分布') plt.show() |
五、注意事项
-
数据量要求:当样本量小于分箱数时(如n=5却要求q=10),会触发
ValueError
。 -
极端值处理:对包含极端离群值的数据,
pd.qcut
可能生成极宽或极窄的区间。 -
性能优化:对超大数据集(>1e6行),建议先抽样计算分位数边界,再应用到全量数据。