Pandas - 使用自定义百分位数剪切记录

Mak*_*ich 3 python dataframe pandas

我有一个带有一列连续变量的熊猫数据框。我需要将它们转换为 3 个 bin,这样第一个 bin 包含 <20% 的值,第二个包含 20 到 80% 之间的值,最后一个包含 >80% 的值。

我试图通过首先获取此类百分位数的 bin 边界,然后使用 pandas cut 函数来实现它。问题是我得到了一个奇怪的结果,只得到了中间的 bin 编码。请参阅以下内容:

test = [x for x in range(0,100)]
a = pd.DataFrame(test)

np.percentile(a, [20, 80])
Out[52]: array([ 19.8,  79.2])

pd.cut(a[0], np.percentile(a[0], [20, 80]))

...
15             NaN
16             NaN
17             NaN
18             NaN
19             NaN
20    (19.8, 79.2]
21    (19.8, 79.2]
22    (19.8, 79.2]
...
78    (19.8, 79.2]
79    (19.8, 79.2]
80             NaN
Run Code Online (Sandbox Code Playgroud)

为什么呢?我虽然 pandas cut 要求您提供您想要获得的垃圾箱的边界。提供 2 个边界我应该得到 3 个垃圾箱,但似乎不能这样工作。

WeN*_*Ben 6

如果您需要 3 个垃圾箱,那么您需要 4 个休息区。

test = [x for x in range(0,100)]
a = pd.DataFrame(test)
np.percentile(a, [0,20, 80,100])
Out[527]: array([ 0. , 19.8, 79.2, 99. ])
pd.cut(a[0], np.percentile(a[0], [0,20, 80,100]))
Run Code Online (Sandbox Code Playgroud)

此外,在熊猫中我们有qcut,这意味着您不需要从 numpy 中获取 bin

pd.qcut(a[0],[0,0.2,0.8,1])
Run Code Online (Sandbox Code Playgroud)