在Pandas中如何连接无相同列的多个DataFrame?含三表场景
在Pandas中连接三个列不完全相同的DataFrame
当然没问题啦!在Pandas里连接这种列不完全一致的多个DataFrame完全可行,我结合你说的场景(a和b有共同列、b和c有共同列)给你拆解清楚具体做法~
一、横向合并(基于共同列关联,类似SQL JOIN)
这种场景下咱们可以一步步两两合并:先把a和b合并好,再把合并后的结果和c合并就行,核心用pd.merge()方法搞定。
先搞几个示例DataFrame方便演示:
import pandas as pd # DataFrame a:包含id、name、age列 a = pd.DataFrame({ 'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35] }) # DataFrame b:和a共享id列,新增city、salary列 b = pd.DataFrame({ 'id': [1, 2, 4], 'city': ['New York', 'London', 'Paris'], 'salary': [5000, 6000, 7000] }) # DataFrame c:和b共享id列,新增job、experience列 c = pd.DataFrame({ 'id': [1, 3, 4], 'job': ['Engineer', 'Teacher', 'Designer'], 'experience': [5, 8, 3] })
第一步:合并a和b
咱们基于共同的id列合并,默认是内连接(只保留两边都有的id),你也可以用how参数指定左/右/外连接,比如要保留所有id的话就用how='outer':
ab_merged = pd.merge(a, b, on='id', how='outer')
第二步:把合并结果和c再合并
同样基于id列,这里我用外连接来保留所有存在的id数据:
final_merged = pd.merge(ab_merged, c, on='id', how='outer')
合并后的结果会包含三个DataFrame的所有列,缺失的数据会自动用NaN填充,完美保留所有关联关系~
二、纵向拼接(按行堆叠,类似SQL UNION)
如果你的需求是把三个DataFrame按行堆起来(不管列一不一致),直接用pd.concat()就行,它会自动对齐列,缺的列填NaN。
示例代码:
final_concat = pd.concat([a, b, c], ignore_index=True)
ignore_index=True是用来重置行索引的,避免原索引重复混乱;- 如果只想保留三个DataFrame都有的列,加个
join='inner'参数就行:
final_concat_inner = pd.concat([a, b, c], ignore_index=True, join='inner')
这样结果就只会保留三个表都有的id列啦。
几个实用小提醒
- 合并时要明确连接键:如果有多个共同列,可以传列名列表,比如
on=['id', 'name']; - 选对连接类型:根据需求选内连接(只留交集)、左/右连接(保留某一边全部数据)或外连接(保留所有数据);
- 处理重复列名:如果合并后出现重名列(比如a和b有同名但不同含义的列),用
suffixes参数区分,比如pd.merge(a, b, on='id', suffixes=('_from_a', '_from_b'))。
内容的提问来源于stack exchange,提问作者anurag pandey
相关产品推荐
相关产品推荐

