我有 2 個不同長度的資料幀: len(df1) 10104 len(df2) 15560
我想根據兩個資料幀上的公共列(taskID)合并這些。任務 ID 具有重復的 ID,每個 ID 代表一個專案屬于同一個任務。
例子:
df1:
| 任務ID | 任務持續時間 |
|---|---|
| 任務 45 | 2 分鐘 |
| 任務 45 | 5 分鐘 |
| 任務 45 | 7 分鐘 |
| 任務 67 | 8 分鐘 |
| 任務 67 | 9 分鐘 |
df2:
| 任務ID | 性別 |
|---|---|
| 任務 45 | 男性 |
| 任務 45 | 男性 |
| 任務 45 | 男性 |
| 任務 67 | 女性 |
| 任務 67 | 女性 |
當我使用 Pandas 合并功能時,我得到一個長度為 471437 的輸出,它大于兩個資料幀的長度。
我認為這是因為 TaskID 的重復值,我無法洗掉重復項,因為每一行代表不同的專案。
我試過了:
合并=pd.merge(df1,df2, on='TaskID', how='inner')
我得到一個長度為 471437 的輸出
你能幫忙解決這個問題嗎?
uj5u.com熱心網友回復:
您可以使用groupby.cumcount重復資料洗掉 TaskID 并按順序合并:
df1.merge(df2, left_on=['TaskID', df1.groupby('TaskID').cumcount()],
right_on=['TaskID', df2.groupby('TaskID').cumcount()])
輸出:
TaskID key_1 task duration gender
0 task 45 0 2 mins male
1 task 45 1 5 mins male
2 task 45 2 7 mins male
3 task 67 0 8 mins female
4 task 67 1 9 mins female
如果每個 TaskID 的性別是唯一的,您可以通過以下方式更新:
df1['gender'] = df1['TaskID'].map(df2.drop_duplicates('TaskID').set_index('TaskID')['gender'])
uj5u.com熱心網友回復:
您可以交叉連接兩個資料集并屏蔽并洗掉重復的條目:
df1 = pd.DataFrame(data=[["task 45","2 mins"],["task 45","5 mins"],["task 45","7 mins"],["task 67","8 mins"],["task 67","9 mins"]], columns=["TaskID","task duration"])
df2 = pd.DataFrame(data=[["task 45","male"],["task 45","male"],["task 45","male"],["task 67","female"],["task 67","female"]], columns=["TaskID","gender"])
result_df = df1.merge(df2)
cols = ['TaskID','task duration','gender']
result_df[['task duration','gender']] = result_df[cols].mask(result_df[cols].duplicated())[['task duration','gender']]
result_df = result_df.dropna().reset_index(drop=True)
[Out]:
TaskID task duration gender
0 task 45 2 mins male
1 task 45 5 mins male
2 task 45 7 mins male
3 task 67 8 mins female
4 task 67 9 mins female
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/530877.html
