假设我有一系列美元值(value)的 Pandas ,并想使用qcut
离散成9组。观察值#不能被9整除。在这种情况下,SQL Server的ntile
函数具有一种标准方法:它使9个组1中的前n个观察值大于其余(9-n)组。
我在 Pandas 中注意到,哪些组具有x个观测值与x + 1个观测值的分配似乎是随机的。我试图用算法解密代码,以了解分位数功能如何处理此问题,但无法解决。
我有三个相关的问题:
qcut
的行为吗?哪个组获得更多的观察值是随机的? qcut
的行为与NTILE
类似(即,第一组获得x +1个观测值)? NTILE
? (如果这是一项复杂的工作,那么只需概述您的方法即可。)这是SQL Server的
NTILE
输出的示例。Bin |# Observations
1 26
2 26
3 26
4 26
5 26
6 26
7 26
8 25
9 25
这是 Pandas :
Bin |# Observations
1 26
2 26
3 26
4 25 (Why is this 25 vs others?)
5 26
6 26
7 25 (Why is this 25 vs others?)
8 26
9 26
最佳答案
qcut
的行为类似于此,因为它更准确。这是一个例子:
对于第i级,它从分位数(i-1)* 10%开始:
import pandas as pd
import numpy as np
a = np.random.rand(26*10+3)
r = pd.qcut(a, 10)
np.bincount(r.labels)
输出为:
array([27, 26, 26, 26, 27, 26, 26, 26, 26, 27])
如果需要NTILE,则可以自己计算分位数:
n = len(a)
ngroup = 10
counts = np.ones(ngroup, int)*(n//ngroup)
counts[:n%ngroup] += 1
q = np.r_[0, np.cumsum(counts / float(n))]
q[-1] = 1.0
r2 = pd.qcut(a, q)
np.bincount(r2.labels)
输出为:
array([27, 27, 27, 26, 26, 26, 26, 26, 26, 26])
关于Python Pandas qcut行为,其中有#个观察值不能被#个箱整除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20726493/