Bin 使用累积和而不是 python 中的观察值

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


Weight

1

1

0.75

0.5

0.25

0.5

1

1

1

1

我想创建两个数据箱并向数据框中添加一列,以显示每行所在的数据箱,但我不想对观测值进行分箱(即前 5 个观测值进入数据箱 1,最后 5 个观测值进入数据箱) 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 中是否有内置的东西已经做到了这一点,或者有人可以分享关于如何实现这一点的任何想法吗?谢谢!


潇湘沐
浏览 1686回答 2
2回答

慕尼黑的夜晚无繁华

这应该可以做到: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'] = 1df.loc[df.Weight.cumsum() > weight_sum / 2, 'bin'] = 2print(df)输出:   Weight  bin0    1.00    11    1.00    12    0.75    13    0.50    14    0.25    15    0.50    16    1.00    27    1.00    28    1.00    29    1.00    2

拉风的咖菲猫

pd.cut您可以在cumsum列的上使用Weights。df = pd.DataFrame({'Weight' : [1, 1, 0.75, 0.5, 0.25, 0.5, 1, 1, 1, 1]})s =  df['Weight'].sum()pd.cut(df['Weight'].cumsum(), [-1, s/2, s], labels=[1,2])为此s = 8 ,默认创建组(-1, 4]和(4, 8]。(这是数学符号 - 精确的值4将包含在第一组中)您可以选择不同的方式,并通过指定和调整边界将值精确地4放入第二组中,这将为您提供组和right = False[0, 4)[4, 9)pd.cut(df['Weight'].cumsum(), [0, s/2, s+1], labels=[1,2], right=False)和用来指定精确或分别-1的值仍应位于该组中。s+108
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python