Pandas -将一个数据框划分为两个具有近似平均值的组



我想把所有行分成两组,这两组具有相似的平均数。

我有一个大约50行的数据框架,但这可能会变成几千行,其中有一列名为"value"。

value  total   bucket
300048137   3.0741  3.0741  0
352969997   2.1024  5.1765  0
abc13.com   4.5237  9.7002  0
abc7.com    5.8202  15.5204 0
abcnews.go.com  6.7270  22.2474 0
........
www.legacy.com  12.6609 263.0797    1
www.math-aids.com   10.9832 274.0629    1

到目前为止,我尝试使用累积和为总列创建,然后我基本上是根据总列的中点的位置进行分割。基于此解决方案。

test['total'] = test['value'].cumsum()
df_sum = test['value'].sum()//2 
test['bucket'] = np.where(test['total'] <= df_sum, 0,1)

如果我尝试将它们分组并取每组的平均值,那么差异非常显著

display(test.groupby('bucket')['value'].mean())
bucket
0     7.456262
1    10.773905

是否有一种方法可以实现基于均值而不是总和的划分?我在考虑用熊猫的扩张手段,但找不到合适的方法。

我不确定我理解你想做什么,但可能你想按列的分位数分组。如果是这样:

test['bucket'] = pd.qcut(test['value'], q=2, labels=False)

对于value值较小的一半行,它的bucket=0。剩下的是1。通过调整q参数,您可以拥有任意多的组(只要<=行数)。

编辑:新的尝试,现在我想我更了解你的目的了。

df = pd.DataFrame( {'value':pd.np.arange(100)})
df['group'] = df['value'].argsort().mod(2)
df.groupby('group')['value'].mean()
# group
# 0    49
# 1    50
# Name: value, dtype: int64
​
df['group'] = df['value'].argsort().mod(3)
df.groupby('group')['value'].mean()
#group
# 0    49.5
# 1    49.0
# 2    50.0
# Name: value, dtype: float64

最新更新