pandas qcut没有将相同数量的观察结果放入每个箱子中

Car*_*arl 6 python binning pandas

我有一个数据框,我可以从中选择一个列(系列),如下所示:

DF:

            value_rank
275488          90
275490          35
275491          60
275492          23
275493          23
275494          34
275495          75
275496          40
275497          69
275498          14
275499          83
...             ...
Run Code Online (Sandbox Code Playgroud)

value_rank是先前从较大数据集创建的百分位数排名.我想要做的是创建这个数据集的箱子,例如五分之一

pd.qcut(df.value_rank, 5, labels=False)


275488    4
275490    1
275491    3
275492    1
275493    1
275494    1
275495    3
275496    2
...      ...
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这似乎很好,但事实并非如此.

事实上,我有1569列.可被5个分区整除的最近数字是1565,这应该在每个分区中给出1565/5 = 313个观测值.有4个额外的记录,所以我希望有4个箱子有314个观测值,一个有313个观测值.相反,我明白了:

obs =  pd.qcut(df.value_rank, 5, labels=False)
obs.value_counts()

0    329
3    314
1    313
4    311
2    302
Run Code Online (Sandbox Code Playgroud)

我在df中没有nans,也无法想出为什么会发生这种情况.从字面上开始撕掉我的头发!

这是一个小例子:

DF:

            value_rank
286742               11
286835               53
286865               40
286930               31
286936               45
286955               27
287031               30
287111               36
287269               30
287310               18
Run Code Online (Sandbox Code Playgroud)

pd.qcut给出了这个:

pd.qcut(df.value_rank, 5, labels = False).value_counts()
bin  count
1    3
4    2
3    2
0    2
2    1
Run Code Online (Sandbox Code Playgroud)

每个箱子中应该有2个观察值,而箱子1中不应该有3个,而箱子2中应该有1个!

Rob*_*key 10

qcut 试图补偿重复值。如果您将 bin 限制与 qcut 结果一起返回,则可以更早地进行可视化:

In [42]: test_list = [ 11, 18, 27, 30, 30, 31, 36, 40, 45, 53 ]
In [43]: test_series = pd.Series(test_list, name='value_rank')

In [49]: pd.qcut(test_series, 5, retbins=True, labels=False)
Out[49]:
(array([0, 0, 1, 1, 1, 2, 3, 3, 4, 4]),
 array([ 11. ,  25.2,  30. ,  33. ,  41. ,  53. ]))
Run Code Online (Sandbox Code Playgroud)

您可以看到除了将 bin 限制设置为 30 之外别无选择,因此 qcut 必须从第三个 bin 中的预期值中“窃取”一个并将它们放在第二个 bin 中。我认为这只是在更大范围内发生在您的百分位数上,因为您基本上将他们的排名压缩为 1 到 100 的比例。有什么理由不直接在数据上运行 qcut 而不是百分位数或返回精度更高的百分位数?


小智 8

只需尝试使用以下代码:

pd.qcut(df.rank(method='first'),nbins)
Run Code Online (Sandbox Code Playgroud)