考虑下面的简单示例。我对获取包含对应于分位数的类别的分类变量感兴趣。

  df = pd.DataFrame({'A':'foo foo foo bar bar bar'.split(),
                       'B':[0, 0, 1]*2})

df
Out[67]:
     A  B
0  foo  0
1  foo  0
2  foo  1
3  bar  0
4  bar  0
5  bar  1


在熊猫中,qtile可以完成这项工作。不幸的是,由于数据中的联系,qtile在此处将失败。

df['C'] = df.groupby(['A'])['B'].transform(
                     lambda x: pd.qcut(x, 3, labels=range(1,4)))


给出经典的ValueError: Bin edges must be unique: array([ 0. , 0. , 0.33333333, 1. ])

是否有另一个健壮的解决方案(来自任何其他python软件包)不需要重新发明轮子?

它一定要是。我不想自己编写自己的分位数bin函数。创建分位数仓(SASStata等)时,任何体面的统计数据包都可以处理联系。

我想要一些基于合理的方法选择和强大功能的产品。

例如,在此处查找SAS https://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a000146840.htm中的解决方案。

或者在这里查看Stata(http://www.stata.com/manuals13/dpctile.pdf)中众所周知的xtile。请注意此SO帖子Definitive way to match Stata weighted xtile command using Python?

我想念什么?也许使用Scipy

非常感谢!

最佳答案

IIUC,您可以使用numpy.digitize

df['C'] = df.groupby(['A'])['B'].transform(lambda x: np.digitize(x,bins=np.array([0,1,2])))

     A  B  C
0  foo  0  1
1  foo  0  1
2  foo  1  2
3  bar  0  1
4  bar  0  1
5  bar  1  2

关于python - 有数据联系时如何计算 Pandas 中的分位数箱?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38594277/

10-12 17:46