如何合并仅含单列的两个pandas DataFrame?merge是否适用?
合并单列Pandas DataFrame的实现方法
我需要合并两个仅含一列的Pandas DataFrame(df1和df2),期望得到如示例所示的df3。示例代码及输出如下:
import pandas as pd data1 = [ 'A', 'B', 'C'] df1 = pd.DataFrame(data1,columns=['name']) data2 = [ 'B', 'C', 'D'] df2 = pd.DataFrame(data2,columns=['name']) data3 = [ ['A',], ['B','B'], ['C','C'], [None,'D']] df3 = pd.DataFrame(data3,columns=['name_x','name_y']) print(df1) print(df2) print(df3)
输出结果:
name 0 A 1 B 2 C name 0 B 1 C 2 D name_x name_y 0 A None 1 B B 2 C C 3 None D
推荐方法:使用merge的全外连接
最直接的方式是用Pandas的merge方法,指定how='outer'(全外连接),保留两个DataFrame的所有元素,匹配项合并到同一行,不匹配项用NaN填充(可按需转换为None):
import pandas as pd data1 = ['A', 'B', 'C'] df1 = pd.DataFrame(data1, columns=['name']) data2 = ['B', 'C', 'D'] df2 = pd.DataFrame(data2, columns=['name']) # 执行全外连接,指定列后缀区分来源 df3 = pd.merge(df1, df2, on='name', how='outer', suffixes=('_x', '_y')) # 将NaN转换为None(可选操作) df3 = df3.where(pd.notnull(df3), None) print(df3)
输出结果与期望完全一致:
name_x name_y 0 A None 1 B B 2 C C 3 None D
其他可选方法:基于唯一值的分步连接
如果需要对中间流程做额外控制,可以先提取两个DataFrame的所有唯一值,再分别与原表做左连接:
import pandas as pd data1 = ['A', 'B', 'C'] df1 = pd.DataFrame(data1, columns=['name']) data2 = ['B', 'C', 'D'] df2 = pd.DataFrame(data2, columns=['name']) # 获取所有唯一的name值 all_names = pd.DataFrame({'name': pd.concat([df1['name'], df2['name']]).unique()}) # 分别与df1、df2做左连接 df3 = all_names.merge(df1, on='name', how='left').merge(df2, on='name', how='left') # 调整列名并转换NaN为None df3.columns = ['name', 'name_x', 'name_y'] df3 = df3.drop('name', axis=1).where(pd.notnull(df3), None) print(df3)
该方法效果与全外连接一致,步骤稍多,适合需要在中间环节添加自定义逻辑的场景。
内容的提问来源于stack exchange,提问作者beetlej
相关产品推荐
相关产品推荐

