为什么Pandas qcut会给我不等大小的垃圾箱?

时间:2017-06-19 17:03:06

标签: python pandas

Pandas docs有关qcut函数的说法:

  

根据等级或基于样本分位数将变量分离为相等大小的桶。

所以我希望这段代码能给我4个10个值的箱子:

import numpy as np
import pandas as pd

np.random.seed(4242)

y = pd.Series(np.random.randint(low=1, high=10, size=40))
quartiles = pd.qcut(y, 4, labels=['1st', '2nd', '3rd', '4th'])

print('Quartiles:')
print(quartiles.value_counts(sort=False))

y.groupby(quartiles).agg(['count', 'mean']).plot(kind='bar');

但我得到了这个:

Quartiles:
1st    14
2nd     6
3rd    11
4th     9
dtype: int64

graph

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

发生这种情况的原因是因为 python 不知道如何处理“边界线”情况,即可能很容易满足第一和第二四分位数的记录。对您的代码进行简单的调整即可产生所需的结果:

import numpy as np
import pandas as pd

np.random.seed(4242)

y = pd.Series(np.random.randint(low=1, high=10, size=40))
quartiles = pd.qcut(y.rank(method = 'first'), 4, labels=['1st', '2nd', '3rd', '4th'])

print('Quartiles:')
print(quartiles.value_counts(sort=False))

y.groupby(quartiles).agg(['count', 'mean']).plot(kind='bar');

通过使用 rank() 函数说明 Python 使用的方法,我们为 Python 提供了一种处理跨越多个 bin 的记录的清晰方法。在本例中,我使用 (method = 'first') 作为 rank() 函数的参数。

我得到的输出如下:

Quartiles:
1st    10
2nd    10
3rd    10
4th    10
dtype: int64

答案 1 :(得分:0)

查看垃圾箱的边界会突出显示注释中指出的问题。

boundaries = [1, 2, 3.5, 6, 9]

这些界限是正确的。熊猫代码首先创建分位数的值(在qcut中)。然后将样品放入箱中。 2s的范围与第一个四分位数的边界重叠。
第三个值的原因是低于阈值的值是3,高于阈值的值是4。调用熊猫函数分位数是为了使边界位于两个相邻值之间。

结论:当有大量样本时,诸如分位数之类的概念变得越来越合适,因此有更多的值可用于固定边界。