You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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的不同行中。
解决方案

可以通过外连接+数据整理的方式实现需求,以下是两种可行方法:

方法一:分步处理

  1. 先对两个DataFrame重命名列,避免合并后列名冲突:
df1_renamed = df1.rename(columns={'name': 'name_1', 'id': 'id_1'})
df2_renamed = df2.rename(columns={'name': 'name_2', 'id': 'id_2'})
  1. 以姓名列为关联键做外连接:
merged = pd.merge(df1_renamed, df2_renamed, left_on='name_1', right_on='name_2', how='outer')
  1. 填充空值并整理列顺序:
# 将空值替换为空字符串
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:31:35