如何移除DataFrame中格式不一致的重复数据
姓名格式不一致的重复数据清洗方案
核心思路是先将所有姓名转换为统一规则的标准化标识,再基于该标识去重,具体操作步骤如下:
- 首先编写姓名标准化规则,统一解析不同格式的姓名结构:
- 若姓名包含逗号,判定为「姓, 名 中间名缩写」格式,按逗号拆分为姓、名+中间名两部分
- 若姓名不包含逗号,判定为「名 中间名缩写 姓」格式,按空格拆分后取最后一段为姓,其余部分拼接为名+中间名
- 对解析后的姓、名部分做归一化处理:统一转为小写、去除多余标点和首尾空格,生成唯一的标准化标识
- 基于标准化标识对数据集去重,可根据需求保留首次出现的记录、格式更规范的记录等
以下是常用的Python+pandas实现代码:
import pandas as pd def standardize_name(name): # 基础清洗:统一小写、去除首尾空格 name = name.strip().lower() if ',' in name: # 处理「姓, 名 中间名」格式 last_name, rest = name.split(',', 1) rest = rest.strip() else: # 处理「名 中间名 姓」格式 name_parts = name.split() last_name = name_parts[-1] rest = ' '.join(name_parts[:-1]).strip() # 去除多余标点,生成标准化键 last_name = last_name.replace('.', '').strip() rest = rest.replace('.', '').strip() return f"{last_name}#{rest}" # 示例数据读取,替换为你的数据集路径即可 df = pd.read_csv("your_dataset.csv") # 生成标准化去重键 df["name_standard_key"] = df["Name"].apply(standardize_name) # 去重,keep参数可调整为'last'保留最后一条,或者自定义规则保留 df_deduplicated = df.drop_duplicates(subset="name_standard_key", keep="first") # 移除中间辅助列 df_deduplicated = df_deduplicated.drop(columns="name_standard_key")
注意事项
- 如果存在中间名全拼和缩写共存的场景(如
John David Doe和John D. Doe),可以在标准化函数中补充中间名首字母提取规则,进一步覆盖重复场景 - 如果数据集包含带空格的特殊姓氏(如
van der Sar、复姓等),需要提前梳理特殊姓氏列表,调整拆分逻辑避免拆分错误
内容的提问来源于stack exchange,提问作者John Patrick Laurel
相关产品推荐
相关产品推荐

