根据pandas中的多个键合并两个DataFrame

问题描述 投票:0回答:3

pandas(或其他模块)是否有任何功能支持基于多个键合并(或连接)两个表?

例如,我有两个表(DataFrame)

a
b

>>> a
A  B  value1
1  1      23
1  2      34
2  1    2342
2  2     333

>>> b
A  B  value2
1  1    0.10
1  2    0.20
2  1    0.13
2  2    0.33

期望的结果是:

A  B  value1  value2
1  1      23    0.10
1  2      34    0.20
2  1    2342    0.13
2  2     333    0.33
python pandas merge dataframe
3个回答
111
投票

要按多个键合并,只需将列表中的键传递给

pd.merge
:

>>> pd.merge(a, b, on=['A', 'B'])
   A  B  value1  value2
0  1  1      23    0.10
1  1  2      34    0.20
2  2  1    2342    0.13
3  2  2     333    0.33

事实上,

pd.merge
的默认设置是使用两个DataFrame的列标签的交集,因此
pd.merge(a, b)
在这种情况下同样可以很好地工作。


11
投票

根据最新的 pandas 文档,on 参数接受字段名称上的

label
list
,并且必须在两个数据框中找到。这是一个 MWE 供其使用:

a = pd.DataFrame({'A':['0', '0', '1','1'],'B':['0', '1', '0','1'], 'v':True, False, False, True]})

b = pd.DataFrame({'A':['0', '0', '1','1'], 'B':['0', '1', '0','1'],'v':[False, True, True, True]})

result = pd.merge(a, b, on=['A','B'], how='inner', suffixes=['_and', '_or'])
>>> result
    A   B   v_and   v_or

0   0   0   True    False
1   0   1   False   True
2   1   0   False   True
3   1   1   True    True

on:标签或列表 要连接的列或索引级别名称。这些必须在两个 DataFrame 中找到。如果 on 为 None 并且不合并索引,则默认为两个 DataFrame 中列的交集。

查看最新的 pd.merge 文档以了解更多详细信息。


0
投票

您还可以使用

left_on=
right_on=
left_index=
right_index=
参数。在这种情况下,值按照键传递的顺序进行匹配;
left_on
中的第一个键将与
right_on
中的第一个键等匹配。

因此,使用OP中的示例,以下两个会产生相同的输出:

a.merge(b, left_on=['A', 'B'], right_on=['A', 'B'])
a.merge(b, on=['A', 'B'])

但是,

a.merge(b, left_on=['A', 'B'], right_on=['B', 'A'])
将产生非常不同的输出,因为
a['A']
b['B']
匹配,而
a['B']
b['A']
匹配。

如果要匹配的键的命名不同,这尤其有用。例如:

a.merge(b, left_on=['A1', 'A2'], right_on=['B1', 'B2'])

这相当于SQL查询:

SELECT * FROM a INNER JOIN b ON a.A1=b.B1 AND a.A2=b.B2

一个有用的说明:因为重新索引发生在底层(source),所以合并的输出按左键中的值排序(显然 cudf 24.02 中不是这种情况,但那是另一回事)。

© www.soinside.com 2019 - 2024. All rights reserved.