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

如何调整Python代码清理DataFrame中各类重复姓名数据?

夫妻姓名数据清理方案

我正在处理夫妻姓名相关的数据,需要移除单元格内的重复内容完成数据清理。当前数据和期望结果如下:

Current                  Desired
0  John Doe and Jane Doe         John Doe and Jane doe
1  John Doe and John Doe         John Doe
2  John Doe                      John Doe
3  Jane Doe and Jane Doe         Jane Doe
4  Jane Doe and Jane             Jane Doe
5  John and John Doe             John Doe

现有一段代码仅能处理John and John这类完全重复的情况:

df['out'] = df.Current.str.split(' and ').map(lambda x : ' and '.join(set(x)))

调整思路与代码

原代码依赖集合去重,只能识别完全匹配的字符串,无法处理「全称+缩写」这类部分匹配的重复姓名。我们可以通过自定义逻辑判断姓名是否属于同一人,再完成去重:

  1. 编写姓名匹配辅助函数
    判断两个姓名是否为同一人的全称/缩写,通过拆分单词并检查子集关系实现:
def is_same_name(name1, name2):
    words1 = set(name1.lower().split())
    words2 = set(name2.lower().split())
    # 一个姓名的单词是另一个的子集,即为同一人
    return words1.issubset(words2) or words2.issubset(words1)
  1. 编写去重处理函数
    遍历拆分后的姓名列表,保留唯一姓名(优先保留更完整的全称):
def deduplicate_names(names):
    unique_names = []
    for name in names:
        duplicate = False
        for idx, existing in enumerate(unique_names):
            if is_same_name(name, existing):
                # 如果当前姓名更完整,替换已有条目
                if len(name.split()) > len(existing.split()):
                    unique_names[idx] = name
                duplicate = True
                break
        if not duplicate:
            unique_names.append(name)
    # 拼接结果,保持原顺序
    return ' and '.join(unique_names) if len(unique_names) > 1 else (unique_names[0] if unique_names else '')
  1. 应用到DataFrame
df['out'] = df['Current'].str.split(' and ').apply(deduplicate_names)

额外优化(可选)

如果需要统一姓名大小写格式(比如把Jane doe转为Jane Doe),可以添加大小写归一化函数:

def normalize_case(name):
    return ' '.join(word.capitalize() for word in name.lower().split())

df['out'] = df['out'].apply(normalize_case)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:24:18