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

如何删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:47:20