我已經嘗試解決這個問題很長一段時間了,但是無法通過使用pandas的內置方法groupby和transform方法來解決它。
我們的目標是GROUP BY列中的資料ex_date和id,那么內組確定,規范稱為列ref_value_1對值的行其中發現df['calc_date'] == df['ex_date']
這是一個示例輸入:
df = pd.DataFrame({'calc_date': ['1/1/2021', '2/1/2021', '3/1/2021', '1/1/2021', '2/1/2021', '3/1/2021', '1/1/2021', '2/1/2021', '3/1/2021', '1/1/2021', '2/1/2021', '3/1/2021'], 'ex_date': ['2/1/2021', '2/1/2021', '2/1/2021', '2/1/2021', '2/1/2021', '2/1/2021', '2/1/2021', '2/1/2021', '2/1/2021', '2/1/2021', '2/1/2021', '2/1/2021'], 'id': [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4], 'ref_value_1': [1.5, 3.0, 4.5, 5.0, 10.0, 15.0, 15.0, 40.0, 60.0, 75.0, 100.0, 120.0], 'bins': [1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3]})
看起來像:
| 計算日期 | ex_date | ID | ref_value_1 | 垃圾箱 |
|---|---|---|---|---|
| 2021 年 1 月 1 日 | 2021 年 2 月 1 日 | 1 | 1.5 | 1 |
| 2021 年 2 月 1 日 | 2021 年 2 月 1 日 | 1 | 3 | 1 |
| 2021 年 3 月 1 日 | 2021 年 2 月 1 日 | 1 | 4.5 | 1 |
| 2021 年 1 月 1 日 | 2021 年 2 月 1 日 | 2 | 5 | 1 |
| 2021 年 2 月 1 日 | 2021 年 2 月 1 日 | 2 | 10 | 1 |
| 2021 年 3 月 1 日 | 2021 年 2 月 1 日 | 2 | 15 | 1 |
| 2021 年 1 月 1 日 | 2021 年 2 月 1 日 | 3 | 15 | 2 |
| 2021 年 2 月 1 日 | 2021 年 2 月 1 日 | 3 | 40 | 2 |
| 2021 年 3 月 1 日 | 2021 年 2 月 1 日 | 3 | 60 | 2 |
| 2021 年 1 月 1 日 | 2021 年 2 月 1 日 | 4 | 75 | 3 |
| 2021 年 2 月 1 日 | 2021 年 2 月 1 日 | 4 | 100 | 3 |
| 2021 年 3 月 1 日 | 2021 年 2 月 1 日 | 4 | 120 | 3 |
和預期的輸出:
| 計算日期 | ex_date | ID | ref_value_1 | 垃圾箱 | 標準化_val |
|---|---|---|---|---|---|
| 2021 年 1 月 1 日 | 2021 年 2 月 1 日 | 1 | 1.5 | 1 | 0.5 |
| 2021 年 2 月 1 日 | 2021 年 2 月 1 日 | 1 | 3 | 1 | 1 |
| 2021 年 3 月 1 日 | 2021 年 2 月 1 日 | 1 | 4.5 | 1 | 1.5 |
| 2021 年 1 月 1 日 | 2021 年 2 月 1 日 | 2 | 5 | 1 | 0.5 |
| 2021 年 2 月 1 日 | 2021 年 2 月 1 日 | 2 | 10 | 1 | 1 |
| 2021 年 3 月 1 日 | 2021 年 2 月 1 日 | 2 | 15 | 1 | 1.5 |
| 2021 年 1 月 1 日 | 2021 年 2 月 1 日 | 3 | 15 | 2 | 0.375 |
| 2021 年 2 月 1 日 | 2021 年 2 月 1 日 | 3 | 40 | 2 | 1 |
| 2021 年 3 月 1 日 | 2021 年 2 月 1 日 | 3 | 60 | 2 | 1.5 |
| 2021 年 1 月 1 日 | 2021 年 2 月 1 日 | 4 | 75 | 3 | 0.75 |
| 2021 年 2 月 1 日 | 2021 年 2 月 1 日 | 4 | 100 | 3 | 1 |
| 2021 年 3 月 1 日 | 2021 年 2 月 1 日 | 4 | 120 | 3 | 1.2 |
uj5u.com熱心網友回復:
您可以使用groupby 屏蔽不匹配的值并填充每個組transform以獲取參考。然后只需將您的資料與參考分開即可。
ref = df['ref_value_1'].where(df['calc_date'].eq(df['ex_date'])).groupby(df['id']).transform('first')
df['standardized_val'] = df['ref_value_1'].div(ref)
輸出:
calc_date ex_date id ref_value_1 bins standardized_val
0 1/1/2021 2/1/2021 1 1.5 1 0.500
1 2/1/2021 2/1/2021 1 3.0 1 1.000
2 3/1/2021 2/1/2021 1 4.5 1 1.500
3 1/1/2021 2/1/2021 2 5.0 1 0.500
4 2/1/2021 2/1/2021 2 10.0 1 1.000
5 3/1/2021 2/1/2021 2 15.0 1 1.500
6 1/1/2021 2/1/2021 3 15.0 2 0.375
7 2/1/2021 2/1/2021 3 40.0 2 1.000
8 3/1/2021 2/1/2021 3 60.0 2 1.500
9 1/1/2021 2/1/2021 4 75.0 3 0.750
10 2/1/2021 2/1/2021 4 100.0 3 1.000
11 3/1/2021 2/1/2021 4 120.0 3 1.200
uj5u.com熱心網友回復:
您可以將 lambda 函式應用于 groupby 物件,其中'ref_value_1'每個組中的每個物件除以'ref_value_1'對應的位置'calc_date'=='ex_date':
df['standardized_val'] = df.groupby(['ex_date','id']).apply(lambda x: x['ref_value_1'] / x.loc[x['calc_date']==x['ex_date'], 'ref_value_1'].iloc[0]).droplevel([0,1])
輸出:
calc_date ex_date id ref_value_1 bins standardized_val
0 1/1/2021 2/1/2021 1 1.5 1 0.500
1 2/1/2021 2/1/2021 1 3.0 1 1.000
2 3/1/2021 2/1/2021 1 4.5 1 1.500
3 1/1/2021 2/1/2021 2 5.0 1 0.500
4 2/1/2021 2/1/2021 2 10.0 1 1.000
5 3/1/2021 2/1/2021 2 15.0 1 1.500
6 1/1/2021 2/1/2021 3 15.0 2 0.375
7 2/1/2021 2/1/2021 3 40.0 2 1.000
8 3/1/2021 2/1/2021 3 60.0 2 1.500
9 1/1/2021 2/1/2021 4 75.0 3 0.750
10 2/1/2021 2/1/2021 4 100.0 3 1.000
11 3/1/2021 2/1/2021 4 120.0 3 1.200
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/406622.html
標籤:
上一篇:如何標記資料框組的最后一行?
