使用pandas进行数据分箱

预生成随机数据

import pandas as pd # version 1.3.5
import numpy as np
def create_df():
    df = pd.DataFrame({'score': np.random.randint(0,101,1000)})
    return df
df =  create_df()
df.head()


score

0

63

1

21

2

76

3

0

4

0

between & loc

Pandas .between 方法返回一个包含 True 的布尔向量,用来对应的 Series 元素位于边界值 left 和 right[1] 之间。

参数有下面三个:

left:左边界

right:右边界

inclusive:要包括哪个边界。可接受的值为 {“both”、“neither”、“left”、“right”}。

根据以下间隔规则将学生的分数分为等级:

A: (80, 100]

B: (50, 80]

C: [0, 50]

其中方括号 [ 和圆括号 ) 分别表示边界值是包含的和不包含的。我们需要确定哪个分数在感兴趣的区间之间,并为其分配相应的等级值。注意看下面的不同的参数表示是否包含边界

df.loc[df['score'].between(0, 50, 'both'), 'grade'] = 'C'
df.loc[df['score'].between(50, 80, 'right'), 'grade'] = 'B'
df.loc[df['score'].between(80, 100, 'right'), 'grade'] = 'A'
df


score

grade

0

63

B

1

21

C

2

76

B

3

0

C

4

0

C

...

...

...

995

39

C

996

71

B

997

64

B

998

57

B

999

84

A

1000 rows 2 columns

df.grade.value_counts()
C    490
B    313
A    197
Name: grade, dtype: int64

cut

可以使用 cut将值分类为离散的间隔。此函数对于从连续变量到分类变量[2] 也很有用。

cut的参数如下:

x:要分箱的数组。必须是一维的。

bins:标量序列:定义允许非均匀宽度的 bin 边缘。

labels:指定返回的 bin 的标签。必须与上面的 bins 参数长度相同。

include_lowest: (bool) 第一个区间是否应该是左包含的。

bins = [0, 50, 80, 100]
labels = ['C', 'B', 'A']
df['grade'] = pd.cut(x = df['score'], bins = bins, labels = labels, include_lowest = True)
df.grade.value_counts()
C    498
B    312
A    190
Name: grade, dtype: int64

qcut

qcut可以根据排名或基于样本分位数将变量离散为大小相等的桶[3]。

在前面的示例中,我们为每个级别定义了分数间隔,这回使每个级别的学生数量不均匀。在下面的示例中,我们将尝试将学生分类为 3 个具有相等(大约)数量的分数等级。示例中有 1000 名学生,因此每个分箱应该有大约 333 名学生。

qcut参数:

x:要分箱的输入数组。必须是一维的。

q:分位数。10 表示十分位数,4 表示四分位数等。也可以是交替排列的分位数,例如[0, .25, .5, .75, 1.] 四分位数。

labels:指定 bin 的标签。必须与生成的 bin 长度相同。

retbins: (bool) 是否返回 (bins, labels)。

df['grade'], cut_bin = pd.qcut(df['score'], q = 3, labels = ['C', 'B', 'A'], retbins = True)
df.head()


score

grade

0

63

B

1

21

C

2

76

A

3

0

C

4

0

C

# 如果 retbins 设置为 True 则会返回 bin 边界。
print (cut_bin)
[  0.  32.  67. 100.]
df.grade.value_counts()
B    339
C    334
A    327
Name: grade, dtype: int64

value_counts

df['score'].value_counts(bins = 3, sort = False)
(-0.101, 33.333]    346
(33.333, 66.667]    320
(66.667, 100.0]     334
Name: score, dtype: int64
df['score'].value_counts(bins = [0,50,80,100], sort = False)
(-0.001, 50.0]    498
(50.0, 80.0]      312
(80.0, 100.0]     190
Name: score, dtype: int64
展开阅读全文

页面更新:2024-04-22

标签:数组   示例   位数   边界   间隔   变量   分数   等级   参数   数据   学生

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top