我有一个像这样的 Pandas 系列:
0 1787
1 4789
2 1350
3 1476
4 0
5 747
6 307
7 147
8 221
9 -88
10 9374
11 264
12 1109
13 502
14 360
15 194
16 4073
17 2317
18 -221
20 0
21 16
22 106
29 105
30 4189
31 171
32 42
我想创建 4 个 one 热编码变量,指示每行的哪个值位于哪个四分位数,将序列分为 4 个四分位数。它会是这样的:
0 1787 Q1 Q2 Q3 Q4
1 4789 0 0 0 0
2 1350 0 0 0 1
3 1476 1 0 0 0
4 0 0 1 0 0
5 747 0 0 1 0
6 307 1 0 1 0
7 147 0 1 0 1
我知道数字并不完全匹配,这只是为了给出所需输出的直观示例。
我已经尝试过这个:
series.quantile[0.25, 0.5, 0.75, 1]
但这只喊出了这四个值:
0.25 67
0.50 442.5
0.75 1477.75
1.00 71188
我也尝试过这个:
series.apply(lambda x : series.quantile(x, 'lower'))
但是这会出现以下错误:
ValueError:百分位数应全部位于区间 [0, 1] 内。尝试改为 17.87
。
实现我的目标的最佳方式是什么?
提前非常感谢
最佳答案
以下代码包含 pandas.qcut和 pandas.get_dummies应该做
quantiles = pd.qcut(series,
[0, 0.25, 0.5, 0.75, 1],
labels=['Q1', 'Q2', 'Q3', 'Q4'])
dummies = pd.get_dummies(quantiles)
pd.concat([df, dummies], axis=1)
导致
Series Q1 Q2 Q3 Q4
0 1787 0 0 0 1
1 4789 0 0 0 1
2 1350 0 0 1 0
3 1476 0 0 0 1
4 0 1 0 0 0
5 747 0 0 1 0
6 307 0 0 1 0
7 147 0 1 0 0
8 221 0 1 0 0
9 -88 1 0 0 0
10 9374 0 0 0 1
11 264 0 1 0 0
12 1109 0 0 1 0
13 502 0 0 1 0
14 360 0 0 1 0
15 194 0 1 0 0
16 4073 0 0 0 1
17 2317 0 0 0 1
18 -221 1 0 0 0
20 0 1 0 0 0
21 16 1 0 0 0
22 106 0 1 0 0
29 105 1 0 0 0
30 4189 0 0 0 1
31 171 0 1 0 0
32 42 1 0 0 0
关于Python 2.7 - 计算每行的分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53692659/