pandas数据合并:详解内连接(交集)与外连接(并集)
本文深入解析pandas中merge函数的默认行为及参数控制。默认merge执行内连接(inner),仅保留键的交集;通过设置how='outer'可执行外连接(outer),保留所有键并填充NaN。文章通过具体代码示例展示了如何处理键值匹配、笛卡尔积扩展及缺失值填补,帮助开发者掌握不同场景下的数据合并策略。
在数据处理领域,合并多个数据集是常见操作,其中基于键(key)的交集与并集求取是最核心的两种模式。回顾pandas库中merge功能的默认行为,可以发现其默认执行的是内连接(inner join),即仅保留两个数据集中共同存在的键记录,这本质上是一种求取交集的操作。
为了直观展示这一过程,我们首先定义两个示例数据集:df1包含data1列和key列,df2包含data2列和key列。具体数据内容如下所示:
In [26]: df1 Out[26]: data1 key 0 0 b 1 1 b 2 2 a 3 3 c 4 4 a 5 5 a 6 6 b
In [27]: df2 Out[27]: data2 key 0 0 a 1 1 b 2 2 d 3 3 b
执行默认的pd.merge(df1, df2)操作后,得到的结果集仅包含key列中同时存在于df1和df2中的值(即'a'和'b')。值得注意的是,虽然键(key)进行了交集筛选,但对应的数据列(data1和data2)进行了合并。这种设计符合逻辑,因为如果仅仅筛选交集而不合并数据,就失去了“数据合并”的意义。
In [28]: pd.merge(df1,df2) Out[28]: data1 key data2 0 0 b 1 1 0 b 3 2 1 b 1 3 1 b 3 4 6 b 1 5 6 b 3 6 2 a 0 7 4 a 0 8 5 a 0
上述结果清晰地表明,merge默认行为是对key求交集,同时对非键列进行并集式的合并。如果仅求交集而不进行数据合并,则无法体现数据关联的价值。
接下来,我们显式指定how='inner'参数,以验证显式内连接与默认行为的一致性。代码如下:
In [29]: pd.merge(df1,df2,how='inner') Out[29]: data1 key data2 0 0 b 1 1 0 b 3 2 1 b 1 3 1 b 3 4 6 b 1 5 6 b 3 6 2 a 0 7 4 a 0 8 5 a 0
In [30]: result_inner = pd.merge(df1,df2,how='inner') In [31]: result_default = pd.merge(df1,df2)
In [32]: result_inner == result_default Out[32]: data1 key data2 0 True True True 1 True True True 2 True True True 3 True True True 4 True True True 5 True True True 6 True True True 7 True True True 8 True True True
对比结果显示,显式指定how='inner'的结果与不指定参数(默认行为)的结果完全一致。这证实了pandas中merge函数默认即为内连接模式。
若希望保留两个数据集中所有的键(即求取并集),需要指定how='outer'参数进行外连接。示例代码如下:
In [35]: result_outer = pd.merge(df1,df2,how='outer')
In [36]: result_outer Out[36]: data1 key data2 0 0.0 b 1.0 1 0.0 b 3.0 2 1.0 b 1.0 3 1.0 b 3.0 4 6.0 b 1.0 5 6.0 b 3.0 6 2.0 a 0.0 7 4.0 a 0.0 8 5.0 a 0.0 9 3.0 c NaN 10 NaN d 2.0
执行外连接后,结果集中的key列包含了df1和df2中出现的所有唯一键值。对于在其中一个数据集中缺失的记录,pandas会自动使用NaN(Not a Number)进行填充,以确保所有键都能被保留。
此外,还需注意合并后数据行的数量变化。当两个数据集通过key进行连接时,结果集的行数取决于key值的匹配情况。如果存在一对多或多对多的匹配关系,结果集的行数将是两组数据中匹配key数量的笛卡尔积。对于无法匹配的键,另一侧数据将生成NaN对象以维持结构完整。
以上关于pandas数据合并中内连接(交集)与外连接(并集)的机制解析完毕。希望这些示例能帮助读者更好地理解merge函数的行为,并在实际开发中灵活运用。欢迎收藏并支持本站获取更多技术分享。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









