如何基于name列内容合并两个pandas DataFrame并按指定格式输出?
问题描述
我有两个pandas DataFrame(df1和df2),数据如下:
import pandas as pd data1 = [['tom', '10'], ['nick', '15'], ['juli', '14']] df1 = pd.DataFrame(data1, columns=['name', 'id']) data2 = [['tom', '59'], ['jane', '20'], ['leo', '17']] df2 = pd.DataFrame(data2, columns=['name', 'id']) # df1 # name id # 0 tom 10 # 1 nick 15 # 2 juli 14 # df2 # name id # 0 tom 59 # 1 jane 20 # 2 leo 17
需要将它们合并为如下格式的DataFrame:
data_merged = [['tom', '10', 'tom', '59'], ['nick', '15', '', ''], ['juli', '14', '', ''], ['', '', 'jane', '20'], ['', '', 'leo', '17']] df_merged = pd.DataFrame(data_merged, columns=['name_1', 'id_1', 'name_2', 'id_2']) # df_merged # name_1 id_1 name_2 id_2 # 0 tom 10 tom 59 # 1 nick 15 # 2 juli 14 # 3 jane 20 # 4 leo 17
合并规则:
- 若df1和df2的name列内容相同,则在合并后的df_merged中出现在同一行;
- 否则,将数据放在df_merged的不同行中。
解决方案
可以通过外连接+数据整理的方式实现需求,以下是两种可行方法:
方法一:分步处理
- 先对两个DataFrame重命名列,避免合并后列名冲突:
df1_renamed = df1.rename(columns={'name': 'name_1', 'id': 'id_1'}) df2_renamed = df2.rename(columns={'name': 'name_2', 'id': 'id_2'})
- 以姓名列为关联键做外连接:
merged = pd.merge(df1_renamed, df2_renamed, left_on='name_1', right_on='name_2', how='outer')
- 填充空值并整理列顺序:
# 将空值替换为空字符串 merged = merged.fillna('') # 提取目标列并重置索引 final_df = merged[['name_1', 'id_1', 'name_2', 'id_2']].reset_index(drop=True)
方法二:拆分匹配与非匹配行
这种方式逻辑更清晰,适合理解合并规则:
# 以name为键做外连接,添加后缀区分来源 full_merge = pd.merge(df1, df2, on='name', how='outer', suffixes=('_1', '_2')) # 提取name匹配的行,补充name_2列 matched_rows = full_merge.dropna(subset=['id_1', 'id_2']).copy() matched_rows['name_2'] = matched_rows['name'] # 提取df1独有的行,填充df2对应列为空字符串 df1_only = full_merge[full_merge['id_2'].isna()].drop(columns=['name', 'id_2']) df1_only[['name_2', 'id_2']] = '' # 提取df2独有的行,填充df1对应列为空字符串 df2_only = full_merge[full_merge['id_1'].isna()].drop(columns=['name', 'id_1']) df2_only[['name_1', 'id_1']] = '' # 拼接所有行并重置索引 final_df = pd.concat([matched_rows[['name_1','id_1','name_2','id_2']], df1_only, df2_only]).reset_index(drop=True)
执行任意一种方法后,都能得到符合要求的合并结果。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

