【问题标题】:Merge two DataFrames based on multiple keys in pandas根据 pandas 中的多个键合并两个 DataFrame
【发布时间】:2015-11-23 11:52:00
【问题描述】:

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

例如,我有两个表(DataFrames)ab

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


    【解决方案1】:

    要通过多个键合并,只需将列表中的键传递给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) 在这种情况下同样适用。

    【讨论】:

    • @SurahLi - 很高兴它有帮助!如果这回答了您满意的问题,请考虑将其标记为已接受的答案。 (或者如果您对merge 仍有疑问,请告诉我,我会尽力回答。)
    • 列名不同怎么办?
    • @EntryLevelR:您可以使用left_onright_on 参数(而不是on)来解决问题。
    • 为什么我不能在这种情况下添加how = 'left'?它生成SyntaxError: keyword argument repeated
    • 当我尝试这个解决方案时,我收到以下错误消息 --> TypeError: merge() missing 1 required positional argument: 'right'
    【解决方案2】:

    根据最新的 pandas 文档,on 参数接受字段名称上的 labellist,并且必须在两个数据帧中都可以找到。这是一个 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 文档了解更多详情。

    【讨论】:

    • 还有其他答案提供了 OP 的问题,它们是前段时间发布的。在发布see: How do I write a good answer? 的答案时,请确保添加新的解决方案或更好的解释,尤其是在回答较老的问题时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多