(2022.05.16 Mon)
数据分箱
分箱指的是将连续值转化为离散值的过程,Pandas指令有cut
,qcut
,value_count
和between
,用于将连续数据转换为离散数据。
cut
和qcut
cut
指令用于将指定的序列按数量排序分组形成分位点,保证每组数值覆盖的范围大致相同。其中用于执行cut
操作的对象只能是array-list data,不能是一个DataFrame;参数bins
可以指定为一个标量(表示范围均分成几份,而不是每一个bin中的数据个数相同),或一个数组(手动指定范围);参数labels
用于给每个bin加名字,如果不指定则以该bin的范围表示;参数right
表示是否包含bin的右部,默认是True
表示bin的范围是左开右闭型即包含右部,False
表示左闭右开型即不含右部;include_lowest
表示是否包含左边界值,True
or False
。
>>> df1 = pd.DataFrame({'number': np.random.randint(1, 100, 1000)}) # 1000个随机数,分布于1到1000
>> df1['bins'] = pd.cut(df1['number'], bins=5, labels=['a', 'b', 'c', 'd', 'e']) # 对number数列的数字范围进行均分,每个bin分别冠以a到e的值
# df1['bins'] = pd.cut(df1['number'], 5, labels=['a', 'b', 'c', 'd', 'e']) # 与上一条命令等价
>> df1['bins'].value_counts() # 统计每个bin出现次数
d 204
c 203
a 200
e 200
b 193
Name: bins, dtype: int64
将bin的范围固定。
>> df= pd.DataFrame({'number':np.random.randint(1, 100, 5)}) # 10个随机数,分布于1到100
>> df['bins'] = pd.cut(x=df['number'], bins=[1, 20, 40, 60, 80, 100]) # 将随机数分配到指定的bins,并生成新的列
>> df
number bins
0 59 (40, 60]
1 37 (20, 40]
2 91 (80, 100]
3 5 (1, 20]
4 82 (80, 100]
设定bin的左闭右开。
>> df= pd.DataFrame({'number':np.random.randint(1, 100, 5)})
>> df['bins'] = pd.cut(x=df['number'], bins=[1,20,40,60,80,100], \
right=False) # 设定左闭右开
df
number bins
0 2 [1, 20)
1 21 [20, 40)
2 96 [80, 100)
3 87 [80, 100)
4 36 [20, 40)
qcut
指令用于得到序列的分位值,即从数量上均分bin,或每个bin的数据个数相同/相差不多。参数部分与cut
类似;retbins
参数如果为True
将返回bins的范围,默认False
不返回bins结果。
>> df2 = pd.DataFrame({'number':np.random.randint(0, 100, 1000)})
>> df2['bins'], tmp_bins = pd.qcut(x=df2['number'], q=5, labels=['a','b','c','d','e'], retbins=True)
>> df2['bins'].value_counts()
b 214
a 202
d 202
e 198
c 184
Name: bins, dtype: int64
>> tmp_bins
array([ 0. , 18. , 40. , 58.4, 77. , 99. ])