假设我有一系列美元值(value)的 Pandas ,并想使用qcut离散成9组。观察值#不能被9整除。在这种情况下,SQL Server的ntile函数具有一种标准方法:它使9个组1中的前n个观察值大于其余(9-n)组。

我在 Pandas 中注意到,哪些组具有x个观测值与x + 1个观测值的分配似乎是随机的。我试图用算法解密代码,以了解分位数功能如何处理此问题,但无法解决。

我有三个相关的问题:

  • 那里有任何 Pandas 开发人员可以解释qcut的行为吗?哪个组获得更多的观察值是随机的?
  • 是否有一种方法可以强制qcut的行为与NTILE类似(即,第一组获得x +1个观测值)?
  • 如果对#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
    

    这是 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/

    10-11 07:43