外部加入Pandas Dataframe

时间:2017-12-26 16:14:34

标签: python pandas pandasql

我正在尝试外连接(在df1上)两个pandas数据帧。以下是示例数据框:

JobDetail::isConcurrentExectionDisallowed

我试图使用pandasql模块但是我不知道如何处理在df1中加入索引1和在df2加入索引2的情况,因为团队的顺序是相反的。通过pandasql模块,如果团队的顺序是反向的,我不知道如何在组合数据框中切换Team Avg值。

我将不胜感激任何帮助。

2 个答案:

答案 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]

现在,使用df2Team *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

上执行左concatdf3
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