Python Pandas qcut的行为与观察结果不能被#箱整除

All*_*enQ 6 python pandas ranking-functions

假设我有一个大熊猫系列的美元价值,并希望将其分为9组qcut.观察数#不能被9整除.SQL Server的ntile函数对于这种情况有一个标准方法:它使9个组中的前n个1观察大于剩余的(9- n)组.

我在熊猫中注意到,哪些群体的x观察与x + 1观察的分配似乎是随机的.我试图破译algos中的代码来弄清楚分位数函数如何处理这个问题,但无法弄明白.

我有三个相关的问题:

  1. 任何熊猫开发者都可以解释其qcut行为?是随机哪个群体获得更多的观察?
  2. 有没有办法强迫qcut行为类似NTILE(即,第一组获得x + 1观察)?
  3. 如果#2的答案是否定的,那么关于函数的任何想法都会表现得像NTILE?(如果这是一项复杂的工作,只需对您的方法进行概述就会有所帮助.)

以下是SQL Server NTILE输出的示例.

Bin |# Observations
1   26
2   26
3   26
4   26
5   26
6   26
7   26
8   25
9   25
Run Code Online (Sandbox Code Playgroud)

这是熊猫:

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
Run Code Online (Sandbox Code Playgroud)

HYR*_*YRY 2

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)
Run Code Online (Sandbox Code Playgroud)

输出是:

array([27, 26, 26, 26, 27, 26, 26, 26, 26, 27])
Run Code Online (Sandbox Code Playgroud)

如果你想要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)
Run Code Online (Sandbox Code Playgroud)

输出是:

array([27, 27, 27, 26, 26, 26, 26, 26, 26, 26])
Run Code Online (Sandbox Code Playgroud)