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

2024-04-26 05:06:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧

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的所有列。有什么建议很好

期望输出:

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

所以在我的数据帧(df1和df2)中,只有一行与感兴趣的两列完全匹配。也就是说,来自df1的A列和B列只有一行与df2的A列和CC列中的行完全匹配


Tags: 数据dataframeona1k1b0leftdd
3条回答

您还可以将^{}与默认的左联接或^{}一起使用,最后,如果需要,请通过^{}删除NaNs中的行:

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索引匹配。

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

这里没有与2索引匹配的行。

如果我们只通过df1['A]合并,我们得到如下结果: 两个都是DFs=pd.merge(df1,df2,how='left',left\u on=['A'],right\u 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

你要找的东西是这样的吗?

好吧,如果您将列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

相关问题 更多 >