如何调整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)))
调整思路与代码
原代码依赖集合去重,只能识别完全匹配的字符串,无法处理「全称+缩写」这类部分匹配的重复姓名。我们可以通过自定义逻辑判断姓名是否属于同一人,再完成去重:
- 编写姓名匹配辅助函数
判断两个姓名是否为同一人的全称/缩写,通过拆分单词并检查子集关系实现:
def is_same_name(name1, name2): words1 = set(name1.lower().split()) words2 = set(name2.lower().split()) # 一个姓名的单词是另一个的子集,即为同一人 return words1.issubset(words2) or words2.issubset(words1)
- 编写去重处理函数
遍历拆分后的姓名列表,保留唯一姓名(优先保留更完整的全称):
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 '')
- 应用到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
相关产品推荐
相关产品推荐

