我有一個像這樣的熊貓資料框 df:
| ID | 重量 | 一種 |
|---|---|---|
| 一種 | 0.15 | 1 |
| 一種 | 0.25 | 3 |
| 一種 | 0.02 | 2 |
| 一種 | 0.07 | 3 |
| b | 0.01 | 1 |
| b | 0.025 | 5 |
| b | 0.07 | 7 |
| b | 0.06 | 4 |
| b | 0.12 | 2 |
我想洗掉基于 ID 列和重量百分比列的行,這樣對于 df['ID'] = a,有四行。但是,如果我想保留至少 80%(它可以變化)的權重,我必須只保留權重為 0.15 和 0.25 的行(81.6%,每當添加權重超過 80% 時,其余行具有相同的“ID”將被洗掉)。
運行后df會變成這樣:
| ID | 重量 | 一種 |
|---|---|---|
| 一種 | 0.15 | 1 |
| 一種 | 0.25 | 3 |
| b | 0.07 | 7 |
| b | 0.06 | 4 |
| b | 0.12 | 2 |
uj5u.com熱心網友回復:
假設您需要每個 ID 的最高權重,但只保留剛剛超過 0.8 閾值的權重:
(df.sort_values('Weight', ascending=False)
.groupby('ID', group_keys=False)
.apply(lambda g: g[(g.Weight.cumsum() / g.Weight.sum()).lt(0.8).shift(fill_value=True)]))
ID Weight A
1 a 0.25 3
0 a 0.15 1
8 b 0.12 2
6 b 0.07 7
7 b 0.06 4
我們首先Weight按降序排序,然后分組ID并計算我們與閾值比較的累積權重百分比。請注意,我們改變了條件,以便我們保留第一個超過閾值的值,如問題中所示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/427747.html
