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 而不是百分位数或返回精度更高的百分位数?
| 归档时间: |
|
| 查看次数: |
4008 次 |
| 最近记录: |