首页 > 解决方案 > 如何在python中使用pd.qcut对列值> 0的列进行十分位

问题描述

列包含以下数据(数据已按此列的降序排序)。此列中有 200 万条记录,大约有 100 万条记录为零。该列的分布如下

Column Distribution
min 0
mean 4.199
25% 0
50% 0
75% 0
max 1.400000

所以基本上在降序排序后只有前 25% 的数据。在删除零并仅在列值大于 > 0 的情况下对数据进行分箱后,我想为下面的数据创建相同大小的分箱

enter code here

Column
1400000
97000
79000
43000
28000
11000
... so on 
0
0
0
0
0
0
0

我想仅将 column_values > 0 的数据放入十分位数。或者我想在一个 bin 中强制全为零。目前我面临的问题是前 2 个 bin 中的数据包含 150 万和 50000。剩下的 8 个 bin 是 0, 0, 0, .... 即当我查看按 bin 分组的列的总和时。

标签: pythonpandasbins

解决方案


IIUC,您可以屏蔽列并应用 qcut:

s = pd.Series([0,0,0,0,0] + [*range(10)])
pd.qcut(s.where(s>0), np.linspace(0,1,10))

输出:

0                NaN
1                NaN
2                NaN
3                NaN
4                NaN
5                NaN
6     (0.999, 1.889]
7     (1.889, 2.778]
8     (2.778, 3.667]
9     (3.667, 4.556]
10    (4.556, 5.444]
11    (5.444, 6.333]
12    (6.333, 7.222]
13    (7.222, 8.111]
14      (8.111, 9.0]
dtype: category
Categories (9, interval[float64]): [(0.999, 1.889] < (1.889, 2.778] < (2.778, 3.667] < (3.667, 4.556] ... (5.444, 6.333] < (6.333, 7.222] < (7.222, 8.111] < (8.111, 9.0]]

或者quantile

s.where(s>0).quantile(np.linspace(0,1,5))

输出:

0.00    1.0
0.25    3.0
0.50    5.0
0.75    7.0
1.00    9.0
dtype: float64

推荐阅读