如何删除DataFrame中不完全相同但相似的重复数据?
处理DataFrame中非完全重复的重复数据
核心思路
先对语义重复的字段做标准化清洗,把表述不同但实际指代相同的文本转换成统一格式,再用常规去重方法处理。
具体操作步骤
1. 针对不同字段类型做文本标准化
带编号的名称(例:"物流-001"、"物流 001"、"物流001")
提取核心名称,剥离后缀的编号或统一编号格式:
import re def clean_numbered_name(text): # 移除末尾的数字、分隔符(-/_/空格),保留核心名称 cleaned = re.sub(r'[-_\s]?\d+$', '', str(text)).strip() return cleaned # 对两个数据集的目标字段(比如'carrier_name')应用清洗 carrier_data1['standard_name'] = carrier_data1['carrier_name'].apply(clean_numbered_name) carrier_data2['standard_name'] = carrier_data2['carrier_name'].apply(clean_numbered_name)
姓名(例:"张三"、"张三 先生"、"张 三")
去除冗余称谓、空格,统一格式:
def clean_person_name(text): # 去掉空格和常见称谓 cleaned = re.sub(r'\s+|先生|女士|小姐', '', str(text)).strip() return cleaned # 应用到姓名字段(比如'contact_person') carrier_data1['standard_contact'] = carrier_data1['contact_person'].apply(clean_person_name) carrier_data2['standard_contact'] = carrier_data2['contact_person'].apply(clean_person_name)
2. 合并数据集并去重
如果需要合并两个数据集后再规整,基于标准化后的字段判断重复:
import pandas as pd # 合并两个数据集 combined_df = pd.concat([carrier_data1, carrier_data2], ignore_index=True) # 按标准化字段去重,保留第一条出现的数据 final_df = combined_df.drop_duplicates(subset=['standard_name', 'standard_contact'], keep='first') # 可选:删除临时生成的标准化字段,恢复原数据结构 final_df = final_df.drop(columns=['standard_name', 'standard_contact'])
3. 复杂场景的模糊匹配去重
如果遇到同音字、缩写这类难标准化的重复,可以用模糊匹配库识别相似文本:
from fuzzywuzzy import fuzz, process # 设置相似度阈值,超过则视为重复 SIM_THRESHOLD = 85 def merge_similar_entries(df, target_col): unique_vals = df[target_col].unique() match_groups = [] for val in unique_vals: # 找出相似度达标的所有项 matches = process.extract(val, unique_vals, scorer=fuzz.token_sort_ratio) group = [m[0] for m in matches if m[1] >= SIM_THRESHOLD] if group not in match_groups: match_groups.append(group) # 用每组的首个值统一替换相似项 for group in match_groups: df[target_col] = df[target_col].replace(group, group[0]) return df # 对目标字段应用模糊合并 final_df = merge_similar_entries(final_df, 'carrier_name')
内容的提问来源于stack exchange,提问作者Jorge Acosta
相关产品推荐
相关产品推荐

