考虑下面的简单示例。我对获取包含对应于分位数的类别的分类变量感兴趣。
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函数。创建分位数仓(
SAS
,Stata
等)时,任何体面的统计数据包都可以处理联系。我想要一些基于合理的方法选择和强大功能的产品。
例如,在此处查找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/