我有一個包含員工的 DataFrame 及其不同類別的作業時間。
僅當 Empl_Id 下存在 OT 類別時,我才需要重新計算特定類別(不應更新 OT、MILE 和 REST 類別,應更新所有其他類別)。
data = {'Empl_Id': [1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3],
'Category': ["MILE", "REST", "OT", "TRVL", "REG", "ADMIN", "REST", "REG", "MILE", "OT", "TRVL", "REST", "MAT", "REG"],
'Value': [43, 0.7, 6.33, 2.67, 52, 22, 1.17, 16.5, 73.6, 4.75, 1.33, 2.5, 5.5, 52.25]}
df = pd.DataFrame(data=data)
df
| Empl_Id | 類別 | 價值 |
|---|---|---|
| 1 | 英里 | 43 |
| 1 | 休息 | 0.7 |
| 1 | 舊約 | 6.33 |
| 1 | TRVL | 2.67 |
| 1 | 注冊 | 52 |
| 2 | 行政 | 22 |
| 2 | 休息 | 1.17 |
| 2 | 注冊 | 16.5 |
| 3 | 英里 | 73.6 |
| 3 | 舊約 | 4.75 |
| 3 | TRVL | 1.33 |
| 3 | 休息 | 2.5 |
| 3 | 墊 | 5.5 |
| 3 | 注冊 | 52.25 |
邏輯是:
1) 從總小時數中找出 OT 小時數的百分比(OT、REST 和 MILE 不計算在內):
- 第一個 Empl_Id:6.33 (OT) / 2.67 (TRVL) 52 (REG) = 6.33 / 54.67 = 11.58 %
- 2nd Empl_Id: OT Hours 不存在,什么都不應該更新
- 第三個 Empl_Id:4.75 (OT) / 1.33 (TRVL) 5.5 (MAT) 52.25 (REG) = 4.75 / 59.08 = 8.04 %
2) 從每個類別中減去 OT 的百分比(OT、REST 和 MILE 不計算在內):
| Empl_Id | 類別 | 價值 |
|---|---|---|
| 1 | 英里 | 43 |
| 1 | 休息 | 0.7 |
| 1 | 舊約 | 6.33 |
| 1 | TRVL | 2.67 - 11.58 % (0.31) = 2.36 |
| 1 | 注冊 | 52 - 11.58 % (6.02) = 45.98 |
| 2 | 行政 | 22 |
| 2 | 休息 | 1.17 |
| 2 | 注冊 | 16.5 |
| 3 | 英里 | 73.6 |
| 3 | 舊約 | 4.75 |
| 3 | TRVL | 1.33 - 8.04 % (0.11) = 1.22 |
| 3 | 休息 | 2.5 |
| 3 | 墊 | 5.5 - 8.04 % (0.44) = 5.06 |
| 3 | 注冊 | 52.25 - 8.04 % (4.2) = 48.05 |
uj5u.com熱心網友回復:
您可以使用:
keep = ['OT', 'MILE', 'REST']
# get factor
factor = (df.groupby(df['Empl_Id'])
.apply(lambda g: g.loc[g['Category'].eq('OT'),'Value'].sum()
/g.loc[~g['Category'].isin(keep),'Value'].sum()
)
.rsub(1)
)
# update
df.loc[~df['Category'].isin(keep), 'Value'] *= df['Empl_Id'].map(factor)
輸出:
Empl_Id Category Value
0 1 MILE 43.000000
1 1 REST 0.700000
2 1 OT 6.330000
3 1 TRVL 2.360852
4 1 REG 45.979148
5 2 ADMIN 22.000000
6 2 REST 1.170000
7 2 REG 16.500000
8 3 MILE 73.600000
9 3 OT 1.750000
10 3 TRVL 1.290604
11 3 REST 2.500000
12 3 MAT 5.337085
13 3 REG 50.702310
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513799.html
標籤:Python熊猫
下一篇:兩列的比較
