为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

潇湘沐 2023-08-22 16:36:05
假设我有一个数据框,其中有一列如下:Weight110.750.50.250.51111我想创建两个数据箱并向数据框中添加一列,以显示每行所在的数据箱,但我不想对观测值进行分箱(即前 5 个观测值进入数据箱 1,最后 5 个观测值进入数据箱) 2)。相反,我希望进行分箱,使每个分箱的权重总和相等或尽可能接近相等,而不更改列的顺序。所以,我希望结果是Weight  I want  Not this1          1       11          1       10.75       1       10.5        1       10.25       1       10.5        1       21          2       21          2       21          2       21          2       2Pandas 中是否有内置的东西已经做到了这一点,或者有人可以分享关于如何实现这一点的任何想法吗?谢谢!
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

这应该可以做到:


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


查看完整回答
反对 回复 2023-08-22
?
拉风的咖菲猫

TA贡献1995条经验 获得超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


查看完整回答
反对 回复 2023-08-22
  • 2 回答
  • 0 关注
  • 1671 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信