Pandas.merge多键合并的布尔运算符及内连接匹配逻辑确认
Pandas多键Merge的布尔运算符及特性说明
嘿,你的直觉完全正确!我来给你把这个问题讲得明明白白:
1. 多键合并时的布尔运算符
当使用pd.merge()进行多键合并时,采用的是AND布尔运算符——也就是说,只有当所有指定的键(比如你例子里的key1和key2)同时满足left[key] == right[key]的条件时,对应的行才会被匹配并保留到结果中。
2. 结合示例的具体解释
先看你给出的两个DataFrame:
import pandas as pd left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'], 'key2': ['K0', 'K1', 'K0', 'K1'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}) right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'], 'key2': ['K0', 'K0', 'K0', 'K0'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']})
当执行pd.merge(left, right, how='inner', on=['key1','key2'])时,只会保留同时满足left['key1'] == right['key1'] 且 left['key2'] == right['key2']的行。运行这段代码得到的结果是:
key1 key2 A B C D 0 K0 K0 A0 B0 C0 D0 1 K1 K0 A2 B2 C1 D1 2 K1 K0 A2 B2 C2 D2
能看到,left里的第0行(key1=K0, key2=K0)匹配上right的第0行;left里的第2行(key1=K1, key2=K0)匹配上right的第1、2行,而其他行因为要么key1不匹配,要么key2不匹配,都被inner连接过滤掉了。
3. 特性的决定因素
这个多键匹配使用AND逻辑的特性,是由Pandas中连接操作的核心逻辑决定的,和语言特性无关。不管你选择how='inner'、outer、left还是right,多键之间的匹配逻辑始终是“所有键同时相等”(AND)——不同的连接类型只是决定是否保留那些键不匹配的行:
- inner:只保留全匹配的行
- outer:保留所有行,不匹配的地方用NaN填充
- left:保留左表所有行,右表匹配不上的用NaN填充
- right:保留右表所有行,左表匹配不上的用NaN填充
简单说,连接类型决定的是“哪些行被保留”,而多键之间的匹配逻辑(AND)是固定的。
内容的提问来源于stack exchange,提问作者Imad
相关产品推荐
相关产品推荐

