我想把所有行分成两组,这两组具有相似的平均数。
我有一个大约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