将连续数据进行离散化常用的有两种方式:等宽法和等频法。
等宽法:离散化后的每个区间的差值相等。这样的缺点是可能会不同区间包含的元素数量相差较大。
等频法:离散化后的每个区间内包含的元素数量相等。这样的缺点是可能会将相同的元素划分到不同的区间里。
详见pandas的cut,qcut函数的使用和区别
df = pd.DataFrame(data=[x ** 2 for x in range(1, 21)], columns=['a'])
a
0 1
1 4
2 9
3 16
4 25
5 36
6 49
7 64
8 81
9 100
10 121
11 144
12 169
13 196
14 225
15 256
16 289
17 324
18 361
19 400
df['b'] = pd.cut(df['a'], 5)
df
a b
0 1 (0.601, 80.8]
1 4 (0.601, 80.8]
2 9 (0.601, 80.8]
3 16 (0.601, 80.8]
4 25 (0.601, 80.8]
5 36 (0.601, 80.8]
6 49 (0.601, 80.8]
7 64 (0.601, 80.8]
8 81 (80.8, 160.6]
9 100 (80.8, 160.6]
10 121 (80.8, 160.6]
11 144 (80.8, 160.6]
12 169 (160.6, 240.4]
13 196 (160.6, 240.4]
14 225 (160.6, 240.4]
15 256 (240.4, 320.2]
16 289 (240.4, 320.2]
17 324 (320.2, 400.0]
18 361 (320.2, 400.0]
19 400 (320.2, 400.0]
可以看到每个区间的差值都近似为80,但不同区间包含的元素相差较多。
# 也可以加label
df['b'] = pd.cut(df['a'], 5, labels=['q', 'w', 'e', 'r', 't'])
a b
0 1 q
1 4 q
2 9 q
3 16 q
4 25 q
5 36 q
6 49 q
7 64 q
8 81 w
9 100 w
10 121 w
11 144 w
12 169 e
13 196 e
14 225 e
15 256 r
16 289 r
17 324 t
18 361 t
19 400 t
详见pandas的cut,qcut函数的使用和区别
df = pd.DataFrame(data=[x ** 2 for x in range(1, 21)], columns=['a'])
a
0 1
1 4
2 9
3 16
4 25
5 36
6 49
7 64
8 81
9 100
10 121
11 144
12 169
13 196
14 225
15 256
16 289
17 324
18 361
19 400
df['b'] = pd.qcut(df['a'], 5, labels=['q', 'w', 'e', 'r', 't'])
df
a b
0 1 q
1 4 q
2 9 q
3 16 q
4 25 w
5 36 w
6 49 w
7 64 w
8 81 e
9 100 e
10 121 e
11 144 e
12 169 r
13 196 r
14 225 r
15 256 r
16 289 t
17 324 t
18 361 t
19 400 t
df['b'].value_counts()
t 4
r 4
e 4
w 4
q 4
Name: b, dtype: int64
可以看到,每个区间内的元素数量都是相等的
df['b'] = pd.qcut(df['a'], [0, 0.1, 0.2, 0.7, 0.8, 1], labels=['q', 'w', 'e', 'r', 't'])
df['b'].value_counts()
e 10
t 4
r 2
w 2
q 2
Name: b, dtype: int64
可以看到,每个区间长度按照我们设定的长度等比例划分。