Pandas数据分析-数据整理data wrangling, since 2022-05-16

(2022.05.16 Mon)

数据分箱

分箱指的是将连续值转化为离散值的过程,Pandas指令有cutqcutvalue_countbetween,用于将连续数据转换为离散数据。

cutqcut

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. ])

你可能感兴趣的:(Pandas数据分析-数据整理data wrangling, since 2022-05-16)