首页 > 技术文章 > pandas 的pd.cut() 和pd.qcut() 数据分箱

cgmcoding 2020-07-16 16:55 原文

pd.cut()

是把一组数据按照一定bins分割成离散的区间,得到的数据是每个值的落到的区间,此函数对于从连续变量转换为离散变量也很有用

#参数如下:
pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')

参数解释:

1 x:被分割的数组数据,可以是df[col],np.array,还可以是pd.seres,list 但是数据必须是一维的
2 bins:被分割后的区间,有三种形式,int值(如bins=5,就是将x平均分为5位),list或者np.array(如bins=[1,2,3],则将x按照(1,2],(2,3]分割),pandas.IntervalIndex 定义要使用的精确区间
3 right:bool型参数,默认为True,表示是否包含区间右部
4 labels:给分割后的区间打标签,但是labels的长度必须和分割后的区间的长度相等
5 retbins:bool型的参数,表示是否将分割后的bins返回
6 precision:保留区间小数点的位数,默认为3
7 include_lowest:bool型的参数,表示区间的左边是开还是闭的,默认为false,也就是不包含区间左部(闭)
8 duplicates:是否允许重复区间

返回值:

分割后每个值落在的区间

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris=load_iris()

a=np.arange(1,100)  #np.array
b=[i for i in range(1,100)]  #list
df=pd.DataFrame(iris.data,columns=iris.feature_names)  #df
ser=pd.Series(a)  #series
tp=tuple(a)  #tuple

pd.cut(a,5)
pd.cut(b,5)
pd.cut(df['sepal length (cm)'],5)
pd.cut(ser,5)
pd.cut(tp,5)

运用各种参数

#平均分为5分
pd.cut(a,5)

#按照给定区间划分
pd.cut(a,bins=[0,10,20,40,60,100])

#指定labels
pd.cut(a,bins=[0,10,20,40,60,100],labels=["婴儿","青年","中年","壮年","老年"])

#返回分割后的bins
pd.cut(a,bins=[0,10,20,40,60,100],labels=["婴儿","青年","中年","壮年","老年"],retbins=True)

#返回x中的数据位于第几个bin
pd.cut(a,bins=[0,10,20,40,60,100],labels=False)

 

qcut

qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
基于分位数的离散化功能。 根据等级或基于样本分位数将变量分离为相等大小的桶。 例如,10个分位数的1000个值将产生一个分类对象,表示每个数据点的分位数成员资格。
import numpy as np
import pandas as pd
a=np.random.randn(30)
pd.cut(a,5).value_counts()
pd.qcut(a,5).value_counts()

'''
pd.cut(a,5).value_counts()
Out[674]: 
(-1.145, -0.374]    10
(-0.374, 0.392]      8
(0.392, 1.159]       7
(1.159, 1.926]       4
(1.926, 2.692]       1
dtype: int64

pd.qcut(a,5).value_counts()
Out[675]: 
(-1.142, -0.692]    6
(-0.692, -0.249]    6
(-0.249, 0.39]      6
(0.39, 0.912]       6
(0.912, 2.692]      6
dtype: int64

'''

首先是观察上面的数据, 先分析qcut()函数:qcut(factors, 5),当你用qcut求五分之一时,将选择这些规则选择bins:使你在每个bins里有相同数量的记录。 你有30个记录,所以每个bin应该有6个(你的输出应该是这样的,尽管断点会因随机抽取而不同).这样就是结果中每个分组里面均有6个数存在的原因。 cut()函数:因为cut()会根据值本身而不是这些值的频率选择均匀分布的bins(在本例中直接将bins分成5份)。 因此,因为随机生成一个正态分布数据,你会看到靠近均值bins中的频率更高,外部更少。 这基本上是一个直方图的表格形式。 从上面的分析即可得出qcut()和cut()的区别。

 

推荐阅读