Python 当数据中存在关联时,如何计算熊猫中的分位数箱?
考虑下面的简单示例。我感兴趣的是得到一个分类变量,它包含与分位数对应的类别Python 当数据中存在关联时,如何计算熊猫中的分位数箱?,python,pandas,scipy,statistics,stata,Python,Pandas,Scipy,Statistics,Stata,考虑下面的简单示例。我感兴趣的是得到一个分类变量,它包含与分位数对应的类别 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 在Pandas中,qtile执行此任务。不幸的是,q
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
在Pandas中,qtile
执行此任务。不幸的是,qtile
将在此处失败,因为数据中存在连接
df['C'] = df.groupby(['A'])['B'].transform(
lambda x: pd.qcut(x, 3, labels=range(1,4)))
给出经典的ValueError:Bin边必须唯一:数组([0,0,0.33333333,1.])
是否有另一个不需要重新发明轮子的健壮解决方案(来自任何其他python包)
一定是这样。我不想自己编写自己的分位数bin函数。任何像样的统计数据包都可以在创建分位数箱时处理关系(SAS
,Stata
,等等)
我想要一种基于合理方法选择和稳健的方法
例如,在这里查找SAS中的解决方案
或者在这里查看Stata()中众所周知的xtile。请注意这篇文章
我错过了什么?可能使用Scipy
非常感谢 IIUC,您可以使用
谢谢@NickilMaveli,但它似乎是
numpy.digitized
不创建分位数仓,而是创建线性间隔仓。在这种情况下,您可以将pd.quantile()
方法的输出传递到np.digized
函数。如果存在非唯一值,那么它将分配与最后一个四分位数(这里是3)关联的整数。这确实是一个很好的建议。不幸的是,我认为把它们放在最小的四分位数更为常见。。也许还有另一种解决办法。。
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