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
我想将所有行分成均值相似的两组。
我有一个大约 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