首页 文章

合并不同列名称上的两个不同数据帧[重复]

提问于
浏览
2

这个问题在这里已有答案:

我有两个数据帧,

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 回答

  • 1

    你也可以使用带有默认左连接的joinmerge,如果需要,可以使用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
    
  • 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
    

    EDIT

    你只需要:

    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
    
  • 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中的行行,请尝试将'how'方法更改为inner .

    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
    

    你正在寻找什么方法吗?

相关问题