我正在尝试外连接(在df1上)两个pandas数据帧。以下是示例数据框:
JobDetail::isConcurrentExectionDisallowed
我试图使用pandasql模块但是我不知道如何处理在df1中加入索引1和在df2加入索引2的情况,因为团队的顺序是相反的。通过pandasql模块,如果团队的顺序是反向的,我不知道如何在组合数据框中切换Team Avg值。
我将不胜感激任何帮助。
答案 0 :(得分:2)
设置 -
df1
Team 1 Team 2 Team1_Score Team2_Score
Index
0 A B 25 56
1 B C 30 55
2 D E 35 75
df2
Team 1 Team 2 Team1_Avg Team2_Avg
Index
0 A B 5 15
1 F G 25 10
2 B C 35 15
首先,我们需要对Team *
列进行排序,然后以相同的方式对Team*_Score
列进行排序。我们将使用argsort
来执行此操作。
i = np.arange(len(df1))[:, None]
j = np.argsort(df1[['Team 1', 'Team 2']], axis=1).values
df1[['Team 1', 'Team 2']] = df1[['Team 1', 'Team 2']].values[i, j]
df1[['Team1_Score', 'Team2_Score']] = df1[['Team1_Score', 'Team2_Score']].values[i, j]
现在,使用df2
和Team *
对Team*_Avg
重复相同的过程。
j = np.argsort(df2[['Team 1', 'Team 2']], axis=1).values
df2[['Team 1', 'Team 2']] = df2[['Team 1', 'Team 2']].values[i, j]
df2[['Team1_Avg', 'Team2_Avg']] = df2[['Team1_Avg', 'Team2_Avg']].values[i, j]
现在,执行左外merge
-
df1.merge(df2, on=['Team 1', 'Team 2'], how='left')
Team 1 Team 2 Team1_Score Team2_Score Team1_Avg Team2_Avg
0 A B 25 56 5 15
1 B C 30 55 35 15
2 D E 35 75
答案 1 :(得分:0)
您可以通过翻转列名称与pd.concat()
复制df2。您可以通过使用rename
df3 = df2.rename(columns={'Team 1':'Team 2','Team 2':'Team 1',
'Team1_Avg':'Team2_Avg','Team2_Avg':'Team1_Avg'})
现在我们可以在df2和新创建的merge
concat
和df3
df1.merge(pd.concat([df2,df3]),how='left',on=['Team 1','Team 2'])
它为您提供所需的DataFrame
Team 1 Team 2 Team1_Score Team2_score Team1_Avg Team2_Avg
0 A B 25 56 5.0 15.0
1 B C 30 55 35.0 15.0
2 D E 25 75 NaN NaN