如何合并多个无全共同列但两两有共列的DataFrame且无重复列
解决方案
要实现预期的多表合并,不能直接用pd.concat(它仅按行/列直接拼接,不处理行之间的关联匹配),需要用pd.merge分步做外连接(outer join),利用两两之间的公共列逐步关联所有表:
1. 先创建示例DataFrame(模拟你的数据)
import pandas as pd df1 = pd.DataFrame({ 'A': ['a1', 'a2', 'a3'], 'B': ['b1', 'b2', 'b3'], 'C': ['c1', 'c2', 'c3'] }) df2 = pd.DataFrame({ 'B': ['b1', 'b4', pd.NA], 'D': ['d1', 'd4', 'd5'], 'E': ['e1', 'e4', 'e5'] }) df3 = pd.DataFrame({ 'A': ['a3', pd.NA, pd.NA], 'D': ['d3', 'd4', 'd5'], 'F': ['f3', 'f4', 'f5'], 'G': ['g3', 'g4', 'g5'] })
2. 分步合并
第一步:合并df1和df2
基于公共列B做外连接,保留所有表的行:
merged_12 = pd.merge(df1, df2, on='B', how='outer')
这一步会得到包含A、B、C、D、E的中间表,已完成df1和df2的行关联。
第二步:合并中间表与df3
这里需要同时用A和D作为连接键做外连接——覆盖两种关联场景:
- 当
A列有值时(比如a3),通过A匹配; - 当
A列无值但D列有值时(比如d4、d5),通过D匹配;
执行代码:
final_df = pd.merge(merged_12, df3, on=['A', 'D'], how='outer')
3. 最终结果
输出final_df即可得到你预期的结构:
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 0 | a1 | b1 | c1 | d1 | e1 | NaN | NaN |
| 1 | a2 | b2 | c2 | NaN | NaN | NaN | NaN |
| 2 | a3 | b3 | c3 | d3 | NaN | f3 | g3 |
| 3 | NaN | b4 | NaN | d4 | e4 | f4 | g4 |
| 4 | NaN | NaN | NaN | d5 | e5 | f5 | g5 |
关键说明
how='outer':确保所有表的行都被保留,不丢失任何数据;- 多键连接
on=['A', 'D']:覆盖两种关联逻辑,保证df3能正确匹配到之前的合并结果; - 避免用
pd.concat:它的核心是拼接而非关联,无法处理不同表之间的行匹配需求。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

