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

Pandas合并两个DataFrame 按第二列匹配col1值逗号拼接保留未匹配行

实现方案

核心逻辑是以第一个DataFrame为基准做左连接,保证DF1所有行完整保留,匹配到的行拼接两个表的col1值,未匹配行保留DF1原有col1值。

步骤1:构造测试数据

import pandas as pd
import numpy as np

# 样例DF1
df1 = pd.DataFrame({
    'col1': [1, 7, 4, 2, 33, 83, 78],
    'col2': ['Johnny', 'Cathy', 'Becky', 'Sarah', 'Courtney', 'Avery', 'Adam']
})

# 样例DF2
df2 = pd.DataFrame({
    'col1': [12, 3, 13, 15, 55],
    'col2': ['Johnny', 'Cathy', 'Becky', 'Sarah', 'Adam']
})

步骤2:合并处理

先给两个表的col1重命名避免列名冲突,再做左连接,最后拼接列值:

# 重命名列避免合并时列名重复冲突
df1_rn = df1.rename(columns={'col1': 'col1_left'})
df2_rn = df2.rename(columns={'col1': 'col1_right'})

# 以col2为匹配键做左连接,保留df1的全部行
merge_df = df1_rn.merge(df2_rn, on='col2', how='left')

# 用numpy向量化操作拼接col1,性能远高于逐行apply,适配大型DataFrame场景
merge_df['col1'] = np.where(
    merge_df['col1_right'].isna(),
    merge_df['col1_left'].astype(str),
    merge_df['col1_left'].astype(str) + ', ' + merge_df['col1_right'].astype(str)
)

# 提取目标列得到最终结果
result = merge_df[['col1', 'col2']]

结果验证

打印result可得到完全匹配预期的输出:

col1      col2
0    1, 12    Johnny
1     7, 3     Cathy
2    4, 13     Becky
3    2, 15     Sarah
4       33  Courtney
5       83     Avery
6   78, 55      Adam

注意事项

  • 合并时必须指定how='left'参数,默认内连接会丢失DF1中未匹配到DF2的行
  • 如果你的col1字段本身就是字符串类型,去掉代码中.astype(str)的类型转换逻辑即可
  • 如果不需要极致性能,也可以用apply逐行处理拼接逻辑,代码可读性更高,但大数据量下运行速度会明显慢于向量化写法

内容的提问来源于stack exchange,提问作者user14057357

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:39:27