底部的表格和代碼將比描述提供更多幫助。
我有一個可行的解決方案,但認為它的效率很低,見底。
問題:
我有兩個資料框 df_1 和 df_2 - 這些資料框有一個匹配列 - match_id
df_2 有一個我試圖寫入 df_1 的日期列
df_2 中的每個 match_id 都存在于 df_1 中
我需要根據 match_id 將日期順序寫入 df_1。
重要的是,盡管我只希望 df_2 中的 match_id 行在匹配程序中使用一次。
如果 df_2 中沒有足夠的 match_ids 來填充 df_1 中的所有 id,則將 df_1 中的剩余行留空。
如果我展示它會容易得多:
df_1:
| 指數 | match_id | 日期 |
|---|---|---|
| 0 | 45 | |
| 1 | 45 | |
| 2 | 45 | |
| 3 | 45 | |
| 4 | 46 | |
| 5 | 46 | |
| 6 | 47 |
df_2:
| 指數 | match_id | 日期 |
|---|---|---|
| 0 | 45 | 22 年 1 月 1 日 |
| 1 | 45 | 02/01/22 |
| 2 | 46 | 02/01/22 |
| 3 | 46 | 22 年 5 月 1 日 |
輸出(更新 df_1):
| 指數 | match_id | 日期 |
|---|---|---|
| 0 | 45 | 22 年 1 月 1 日 |
| 1 | 45 | 02/01/22 |
| 2 | 45 | |
| 3 | 45 | |
| 4 | 46 | 02/01/22 |
| 5 | 46 | 22 年 5 月 1 日 |
| 6 | 47 |
我有一個可行的解決方案,但我確信必須有一種非常節省時間/資源的方法(對于 python 來說仍然很新,對編碼來說也很新),因為實際上在更大的資料集上運行它:
import pandas as pd
data_1 = [[45, ""], [45, ""],[45, ""],[45, ""],[46, ""],[46, ""],[47, ""]]
df_1 = pd.DataFrame(data_1, columns = ['match_id', 'date'])
data_2 = [[45, "01/01/22"], [45, "02/01/22"],[46, "01/01/22"],[46, "05/01/22"]]
df_2 = pd.DataFrame(data_2, columns = ['match_id', 'date'])
for i_df_1, r_df_1 in df_1.iterrows():
for i_df_2, r_df_2 in df_2.iterrows():
if r_df_1["match_id"] == r_df_2["match_id"]:
# Add data into the payment transaction dataframe
df_1.loc[i_df_1,"date"] = r_df_2["date"]
# Drop the used row from df_2 so does not get used again
df_2 = df_2.drop(i_df_2)
break
continue
uj5u.com熱心網友回復:
您可以計算一個額外的密鑰groupby.cumcount并將其用于merge:
df_3 = (df_1
#.drop(columns='date') # uncomment if df1 already has an empty date column
.merge(df_2,
left_on=['match_id', df_1.groupby('match_id').cumcount()],
right_on=['match_id', df_2.groupby('match_id').cumcount()],
how='left'
)
#.drop(columns='key_1') # uncomment if unwanted
)
輸出:
match_id key_1 date
0 45 0 01/01/22
1 45 1 02/01/22
2 45 2 NaN
3 45 3 NaN
4 46 0 02/01/22
5 46 1 05/01/22
6 47 0 NaN
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481543.html
