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

如何用Python匹配部分列值合并两个DataFrame?含非Pandas方案咨询

姓名片段匹配关联两个DataFrame的可行方案

核心需求

实现两个带Name列的DataFrame关联,只要姓名中包含至少一个相同的完整名字片段(比如"john"匹配"john-paul"),而非任意子字符串匹配。


方案一:Pandas交叉连接+自定义匹配函数

先做两个DataFrame的全量交叉连接,再用自定义函数过滤出符合匹配条件的行:

import pandas as pd

def has_matching_name(name1, name2):
    # 统一处理分隔符(-转空格),拆分姓名为独立片段并转集合
    parts1 = set(name1.replace('-', ' ').split())
    parts2 = set(name2.replace('-', ' ').split())
    # 检查两个集合是否有交集
    return len(parts1 & parts2) > 0

# 假设df1、df2是你的两个DataFrame,都包含Name列
df1['temp_key'] = 1
df2['temp_key'] = 1
# 生成交叉连接表
cross_table = pd.merge(df1, df2, on='temp_key').drop('temp_key', axis=1)
# 过滤符合匹配条件的行
result = cross_table[cross_table.apply(lambda row: has_matching_name(row['Name_x'], row['Name_y']), axis=1)]

说明:这种方法逻辑直观,但如果DataFrame数据量很大,交叉连接会占用较多内存,适合小数据集使用。


方案二:Pandas拆分扩展+合并(高效版)

通过拆分姓名为独立片段,将多值姓名拆分为单行单姓名,再按姓名片段合并,最后去重避免重复匹配:

import pandas as pd

# 拆分df1的姓名为独立片段,生成多行
df1_expanded = df1.assign(
    name_parts=df1['Name'].str.replace('-', ' ').str.split()
).explode('name_parts')

# 拆分df2的姓名为独立片段,生成多行
df2_expanded = df2.assign(
    name_parts=df2['Name'].str.replace('-', ' ').str.split()
).explode('name_parts')

# 按姓名片段合并,再根据原行索引去重(避免同一行多次匹配)
result = pd.merge(df1_expanded, df2_expanded, on='name_parts').drop_duplicates(
    subset=[df1.index.name or 'index_x', df2.index.name or 'index_y']
)

说明:这种方法避免了全量交叉连接,内存占用更低,适合中大型数据集。


非Pandas原生方案(Python基础实现)

如果不想用Pandas,可以直接用Python循环+集合处理:

# 提取两个DataFrame的姓名列表
names_df1 = df1['Name'].tolist()
names_df2 = df2['Name'].tolist()

matches = []
# 遍历所有姓名组合,检查匹配
for idx1, name1 in enumerate(names_df1):
    parts1 = set(name1.replace('-', ' ').split())
    for idx2, name2 in enumerate(names_df2):
        parts2 = set(name2.replace('-', ' ').split())
        if parts1 & parts2:
            matches.append({
                'df1_index': idx1,
                'df2_index': idx2,
                'Name_df1': name1,
                'Name_df2': name2
            })

# 转成DataFrame查看结果
result = pd.DataFrame(matches)

你之前的问题原因

  1. str.contains失败:str.contains是子字符串匹配,比如"john"会匹配"ajohnb"这类包含"john"子串的内容,无法保证是完整的名字片段匹配,导致误匹配。
  2. 拆分时触发TypeError:大概率是拆分时参数错误,比如误写为split(name)(把姓名本身当成分隔符),而正确的写法应该是split()(按空格拆分)或split('-')(按横杠拆分),错误的参数类型导致了整数解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:32:48