Pandas - 将数据帧分成两组,具有近似平均值

Pandas - partition a dataframe into two groups with an approximate mean value

我想将所有行分成均值相似的两组。

我有一个大约 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

有没有一种方法可以根据平均值而不是总和来实现此分区?我正在考虑使用 pandas 的扩展方法,但找不到合适的方法。

我不确定我是否理解您正在尝试做什么,但您可能想按列的分位数分组。如果是:

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