首页 > 解决方案 > Bin使用累积和而不是python中的观察值

问题描述

假设我有一个数据框,其中有一列如下:

Weight
1
1
0.75
0.5
0.25
0.5
1
1
1
1

我想创建两个箱并在我的数据框中添加一列,显示每行所在的箱,但我不想对观察结果进行分箱(即前 5 个观察到箱 1,最后五个到箱2)。相反,我想在不改变列顺序的情况下进行分箱,以使每个箱的重量总和相等或尽可能接近相等。

所以,我希望结果是

Weight  I want  Not this
1          1       1
1          1       1
0.75       1       1
0.5        1       1
0.25       1       1
0.5        1       2
1          2       2
1          2       2
1          2       2
1          2       2

Pandas 中是否有内置的东西已经做到了这一点,或者有人可以分享任何关于如何实现这一点的想法吗?谢谢!

标签: pythonpandas

解决方案


这应该这样做:

df = pd.DataFrame(
        {'Weight': [1, 1, 0.75, 0.5, 0.25, 0.5, 1, 1, 1, 1]})
weight_sum = df.Weight.sum()
df['bin'] = 1
df.loc[df.Weight.cumsum() > weight_sum / 2, 'bin'] = 2

print(df)

输出:

   Weight  bin
0    1.00    1
1    1.00    1
2    0.75    1
3    0.50    1
4    0.25    1
5    0.50    1
6    1.00    2
7    1.00    2
8    1.00    2
9    1.00    2

推荐阅读