如何以ID和Dept为键对两个DataFrame执行Outer Join?
解决基于多键的DataFrame全外连接问题
嗨,我懂你想要的是基于ID和Dept两个字段的全外连接(Outer Join),但你用的append()方法其实做不到这个——它只是简单地把两个DataFrame的行拼在一起,不会根据指定的键去匹配对应的数据。要实现你要的效果,得用Pandas的merge()函数,专门处理这种基于键的表连接操作。
为什么append()不适用?
df1.append(df2)只是把df2的行直接追加到df1后面,完全不会考虑ID和Dept的匹配关系,最终会得到7行(4+3),但不会把匹配的行合并到同一行,这显然不是你要的外连接效果。
正确的解决方案:使用pd.merge()
我们可以用merge()函数,指定两个连接键['ID', 'Dept'],并设置连接方式为outer(全外连接),这样就能保留两个表中所有的行,匹配不上的列自动用NaN填充。
完整代码示例
import pandas as pd # 构造你的原始DataFrame df1 = pd.DataFrame({ 'Code': ['AA', 'AV', 'TG', 'DF'], 'ID': [3456, 3467, 5437, 3487], 'Dept': ['Marketing', 'Finance', 'Admin', 'Finance'], 'Score': [5, 7, 8, 9], 'Comp': [5, 8, 4, 9] }) df2 = pd.DataFrame({ 'ID': [3467, 5437, 9537], 'Dept': ['Finance', 'Admin', 'Operations'], 'Pay': ['YES', 'NO', 'YES'] }) # 执行全外连接 result = pd.merge(df1, df2, on=['ID', 'Dept'], how='outer') print(result)
输出结果
Code ID Dept Score Comp Pay 0 AA 3456.0 Marketing 5.0 5.0 NaN 1 AV 3467.0 Finance 7.0 8.0 YES 2 TG 5437.0 Admin 8.0 4.0 NO 3 DF 3487.0 Finance 9.0 9.0 NaN 4 NaN 9537.0 Operations NaN NaN YES
关于输出格式的说明
你期望的输出里重复了ID和Dept列,但实际上merge()会把作为连接键的列合并成一列,这是更规范的表连接结果,完全满足你的需求:
- 所有来自df1和df2的行都被保留
- 匹配上的行(比如ID=3467、Dept=Finance)会把两表的字段合并到同一行
- 匹配不上的行(比如df1里的Marketing、df2里的Operations)对应的缺失字段用
NaN填充
内容的提问来源于stack exchange,提问作者Stacey
相关产品推荐
相关产品推荐

