根据 pandas 中的多个键合并两个 DataFrame
Posted
技术标签:
【中文标题】根据 pandas 中的多个键合并两个 DataFrame【英文标题】:Merge two DataFrames based on multiple keys in pandas 【发布时间】:2015-11-23 11:52:00 【问题描述】:pandas(或其他模块)是否具有支持基于多个键合并(或连接)两个表的功能?
例如,我有两个表(DataFrames)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
【问题讨论】:
【参考方案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_on
和right_on
参数(而不是on
)来解决问题。
为什么我不能在这种情况下添加how = 'left'
?它生成SyntaxError: keyword argument repeated
。
当我尝试这个解决方案时,我收到以下错误消息 --> TypeError: merge() missing 1 required positional argument: 'right'【参考方案2】:
根据最新的 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 文档了解更多详情。
【讨论】:
还有其他答案提供了 OP 的问题,它们是前段时间发布的。在发布see: How do I write a good answer? 的答案时,请确保添加新的解决方案或更好的解释,尤其是在回答较老的问题时。以上是关于根据 pandas 中的多个键合并两个 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
Pandas中DataFrame数据合并连接(concatmergejoin)之merge