亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 1767 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號