pandas.qcut及一个很奇怪的bug
Contents
最近用 pandas.qcut
分箱遇到了个很奇怪的bug,先Mark一波
在此之前也顺便记录下 pandas.qcut
, pandas.Series.value_counts
和 pandas.Series.value_counts
的用法
相关函数
pandas.qcut
基于样本数据排序或分位数分箱
|
|
Parameter | type | comment |
---|---|---|
x |
一维 ndarray 或 Series | |
q |
int or list-like of float | 如4,或 [0,0.2,0.8,1] |
labels |
array or False, default None | 对分箱后的区间重命名,要求和bins等数量 |
retbins |
bool, optional | 是否返回边界值 |
precision |
int, optional | 用于调整精度,一般默认 |
duplicates |
‘raise’ or ‘drop’ | ‘raise’: 若边界值重复则报错 ‘drop’: 删除重复的 |
|
|
pandas.Series.value_counts
Return a Series containing counts of unique values.
返回的结果默认是根据频数降序排序,且排除 NaN
|
|
Parameter | type | comment |
---|---|---|
normalize |
bool, default False | If Ture 则返回频率 |
sort |
bool, default True | 按照频数排序 |
ascending |
bool, default False | If True,从小到大排序 |
bins |
int, optional | 仅适用于数值型数据,分箱计数 |
dropna |
bool, default True | If False, 包含 NaN |
|
|
pandas.Series.unique
Return unique values of Series object.
|
|
|
|
那个奇怪的bug
Python
: 3.6.4|Anaconda, Inc.
pandas
: 1.1.5
背景是对数据进行等频分箱
|
|
之后通过value_counts
计数发现有个区间频数为0,且为17个区间
此时,再通过 unique
去重,就只有16个区间,上图中的 (22.0,22.2]
那个区间就没了
根本原因还是数据分布的问题,因为本来是要分20个bin,存在较多边界值重复的情况
解决方案
源码方面的原因暂时不得而知
分箱后得到的数据类型是 Categorical
将其转换为 String
后再进行后续的分组统计计算
|
|