我有一个带有一系列连续变量的pandas数据帧。我需要将它们转换为3个区间,这样第一个区域包含的值<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
为什么会这样?我虽然大熊猫切割需要你提供你想要的垃圾箱的边界。提供2个边界我应该得到3个箱子,但看起来它不会这样工作。
答案 0 :(得分:3)
如果您需要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]))
另外,在大熊猫中我们有qcut
,这意味着你不需要从numpy获取bin
pd.qcut(a[0],[0,0.2,0.8,1])