在不同的列名称上合并两个不同的数据框

时间:2017-05-02 10:04:16

标签: python pandas numpy merge

我有两个数据帧,

df1 = pd.DataFrame({'A': ['A1', 'A1', 'A2', 'A3'],
                     'B': ['121', '345', '123', '146'],
                     'C': ['K0', 'K1', 'K0', 'K1']})

df2 = pd.DataFrame({'A': ['A1', 'A3'],
                      'BB': ['B0', 'B3'],
                      'CC': ['121', '345'],
                      'DD': ['D0', 'D1']})

现在我需要从df1中获取A列和B列的类似行,从df2获取A列和CC列。 所以我尝试了可能的合并选项,例如:

both_DFS=pd.merge(df1,df2, how='left',left_on=['A','B'],right_on=['A','CC'])

这不会给我df2数据帧的行信息,这是我需要的。意思是,我有来自df2的所有列名,但行只是空或Nan。

然后我尝试了:

Both_DFs=pd.merge(df1,df2, how='left',left_on=['A','B'],right_on=['A','CC'])[['A','B','CC']]

这给了我错误,

KeyError: "['B'] not in index"

我的目标是使用df1和df2中的所有列合并Dataframe。任何建议都会很棒

期望的输出:

 Both_DFs
    A   B   C   BB  CC  DD
0   A1  121 K0  B0  121 D0

因此,在我的数据框架(df1和df2)中,只有一行与两个感兴趣的列完全匹配。也就是说,df1中的A列和B列只有一行与df2中A列和CC列的行完全匹配

3 个答案:

答案 0 :(得分:3)

好吧,如果你将列A声明为索引,它就可以工作:

Both_DFs = pd.merge(df1.set_index('A', drop=True),df2.set_index('A', drop=True), how='left',left_on=['B'],right_on=['CC'], left_index=True, right_index=True).dropna().reset_index()

这导致:

    A    B   C  BB   CC  DD
0  A1  123  K0  B0  121  D0
1  A1  345  K1  B0  121  D0
2  A3  146  K1  B3  345  D1

修改

你只需要:

Both_DFs = pd.merge(df1,df2, how='left',left_on=['A','B'],right_on=['A','CC']).dropna()

给出了:

    A    B   C  BB   CC  DD
0  A1  121  K0  B0  121  D0

答案 1 :(得分:1)

您也可以将join与默认左连接或merge一起使用,如有必要,请在dropna之后移除NaN的行:

print (df1.join(df2.set_index('A'), on='A').dropna())
    A    B   C  BB   CC  DD
0  A1  123  K0  B0  121  D0
1  A1  345  K1  B0  121  D0
3  A3  146  K1  B3  345  D1
print (pd.merge(df1, df2, on='A', how='left').dropna())
    A    B   C  BB   CC  DD
0  A1  123  K0  B0  121  D0
1  A1  345  K1  B0  121  D0
3  A3  146  K1  B3  345  D1

编辑:

我认为您需要inner join(默认情况下,on='inner'可以省略):

Both_DFs = pd.merge(df1,df2, left_on=['A','B'],right_on=['A','CC'])
print (Both_DFs)
    A    B   C  BB   CC  DD
0  A1  121  K0  B0  121  D0

答案 2 :(得分:0)

我不知道您的示例是否显示您的问题,但

如果我们尝试与MultiIndex合并,我们需要匹配2个索引。

df1 [' A'] == df2 [' A']&& df1 [' B'] == df2 [' CC']

这里我们没有符合2索引的任何行。

如果我们仅仅通过df1 [' A']合并,我们就会得到这样的结果:     Both_DFs = pd.merge(df1,df2,how =' left',left_on = [' A'],right_on = [' A'])

    A    B   C   BB   CC   DD
0  A1  123  K0   B0  121   D0
1  A1  345  K1   B0  121   D0
2  A2  121  K0  NaN  NaN  NaN
3  A3  146  K1   B3  345   D1

如果您要删除不在df2中的行行,请尝试更改'如何'内心的方法。

Both_DFs=pd.merge(df1, df2, how='left', left_on=['A'], right_on=['A'])
   A    B   C   BB   CC   DD
0  A1  123  K0   B0  121   D0
1  A1  345  K1   B0  121   D0
2  A3  146  K1   B3  345   D1

这种方法是否适用于您所寻找的内容?