讲师中心 微信公众号
AI工具推荐 视频效率加速

如何稳健合并存在姓名拼写差异与出生日期微小偏差的Pandas数据集

大明吖_3792

大明吖_3792

发布时间:2026-07-11 20:28:06

|

871人浏览过

|

来源于php中文网

原创

如何稳健合并存在姓名拼写差异与出生日期微小偏差的Pandas数据集

本文介绍一种结合模糊字符串匹配与容差日期比对的策略,解决多源足球球员数据(如体能统计与追踪统计)因姓名变体、dob微小误差导致的精准关联难题。

本文介绍一种结合模糊字符串匹配与容差日期比对的策略,解决多源足球球员数据(如体能统计与追踪统计)因姓名变体、dob微小误差导致的精准关联难题。

在实际数据分析中,来自不同系统的结构化数据常因命名规范不一、录入误差或字段定义差异而难以直接通过 pd.merge() 完成精确关联。本例中,SC(体能统计)与 SB(追踪统计)虽共享语义相同的字段(Player, D.O.B., Competition),但存在三类典型不一致性:

  • 姓名格式差异:如 "Cristiano Ronaldo" vs "Cristiano Ronaldo dos Santos Aveiro";
  • 出生日期偏差:如 "1987-06-24" vs "1987-06-23"(1天误差);
  • ID体系独立:Player ID 无跨表映射关系,不可作为连接键。

单纯依赖精确匹配(on=['Player', 'D.O.B.'])将导致零行合并结果。因此,需构建语义级关联逻辑,而非语法级等价判断。

✅ 推荐方案:模糊名称 + 容差日期联合匹配

核心思路是:

Pandas Linux版 2.3.3
Pandas Linux版 2.3.3

Pandas 2.3.3 历史版本下载,来自 PyPI 官方发布,适合旧项目兼容、数据分析脚本复现和指定环境安装。

下载
  1. 对 Player 字段使用 fuzzywuzzy.process.extractOne() 计算每名球员在另一表中的最佳匹配得分;
  2. 设定相似度阈值(如 threshold=70),过滤低置信度匹配;
  3. 将 D.O.B. 转为 datetime 类型,并为 SB 表生成 ±N 天的日期扩展副本(如 date_tolerance_days=1);
  4. 在扩展后的 SB 上,以 模糊匹配出的姓名 + 容差内出生日期 为联合键执行 pd.merge()。

以下是可直接运行的完整实现:

import pandas as pd
from fuzzywuzzy import process
from datetime import timedelta

# 构建示例数据(同问题描述)
data_sc = {
    'Player ID': [1, 2, 3, 4],
    'Player': ['Cristiano Ronaldo', 'Leo Messi', 'Neymar Jr.', 'Erling Haaland'],
    'D.O.B.': ['1985-02-05', '1987-06-24', '1992-02-05', '1991-06-28'],
    'Competition': ['La Liga', 'La Liga', 'Ligue 1', 'Premier League'],
    'SC Rating': [90, 91, 92, 93],
}
SC = pd.DataFrame(data_sc)

data_sb = {
    'Player ID': [101, 102, 103, 104],
    'Player': ['Cristiano Ronaldo dos Santos Aveiro', 'Lionel Messi', 'Neymar', 'Erling Haland'],
    'D.O.B.': ['1985-02-05', '1987-06-23', '1992-02-05', '1991-06-29'],
    'Competition': ['La Liga', 'La Liga', 'Ligue 1', 'Premier League'],
    'SB Rating': [91, 92, 93, 94],
}
SB = pd.DataFrame(data_sb)

def fuzzy_date_matching_with_score(
    df1, df2,
    player_key1, player_key2,
    date_key1, date_key2,
    threshold=70,
    date_tolerance_days=1
):
    # 步骤1:对df1中每个Player,在df2.Player中寻找最佳模糊匹配
    matches = df1[player_key1].apply(
        lambda x: process.extractOne(x, df2[player_key2])
    )
    df1 = df1.copy()
    df1['match_name'] = matches.apply(lambda x: x[0] if x[1] >= threshold else None)
    df1['match_score'] = matches.apply(lambda x: x[1] if x[1] >= threshold else None)

    # 步骤2:统一日期类型并生成容差扩展
    df1[date_key1] = pd.to_datetime(df1[date_key1])
    df2[date_key2] = pd.to_datetime(df2[date_key2])

    # 构造df2的“日期膨胀”版本:每行复制2*N+1次,对应±N天偏移
    df2_expanded = pd.concat([
        df2.assign(**{date_key2: df2[date_key2] + timedelta(days=i)})
        for i in range(-date_tolerance_days, date_tolerance_days + 1)
    ], ignore_index=True)

    # 步骤3:基于(match_name, D.O.B.)执行精确合并
    merged = pd.merge(
        df1.dropna(subset=['match_name']),
        df2_expanded,
        left_on=[date_key1, 'match_name'],
        right_on=[date_key2, player_key2],
        how='inner'
    )

    # 步骤4:清理冗余列,保留业务关键字段(去重后取首匹配)
    result = merged.drop_duplicates(
        subset=['Player ID_x', 'match_name', date_key1], keep='first'
    ).copy()

    # 重命名并整理列顺序(符合期望输出)
    result = result.rename(columns={
        'Player ID_x': 'Player ID',
        'Player_x': 'Player',
        'D.O.B.': 'D.O.B.',
        'Competition_x': 'Competition',
        'SC Rating': 'SC Rating',
        'SB Rating': 'SB Rating'
    })[['Player ID', 'Player', 'D.O.B.', 'Competition', 'SC Rating', 'SB Rating']]

    return result

# 执行合并
merged_df = fuzzy_date_matching_with_score(
    SC, SB,
    player_key1='Player', player_key2='Player',
    date_key1='D.O.B.', date_key2='D.O.B.',
    threshold=70,
    date_tolerance_days=1
)

print(merged_df)

⚠️ 注意事项与优化建议

  • 性能考量:fuzzywuzzy 在大数据集上较慢。若数据量 > 10k 行,建议预计算 process.extractOne 或改用更高效的 rapidfuzz(API 兼容且提速 3–5×);
  • 阈值调优:threshold 需根据实际姓名变异程度调整(70~95 区间常见),可通过抽样验证匹配准确率;
  • 多候选处理:当前仅取最高分匹配。若存在歧义(如多名球员得分均 > threshold),可改用 process.extract() 返回 Top-K 并引入业务规则(如优先匹配 Competition 一致者);
  • DOB容差合理性:1天容差适用于录入误差,但若存在时区/格式转换问题(如 1987-06-24 vs 1987-06-24 00:00:00),建议先统一为 date 类型再比较;
  • 最终ID选择:本例保留 SC 的 Player ID(即 Player ID_x)。若需统一ID体系,可在合并后添加映射字典或使用 SB.Player ID_y。

该方法平衡了鲁棒性与可解释性,无需训练模型即可处理现实世界中常见的数据异构问题,是多源体育数据融合的实用范式。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1631

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

3944

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1629

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

22697

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2787

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2827

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1123

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Pandas 官方文档与用户指南
Pandas 官方文档与用户指南

共0课时 | 0人学习

Pandas 教程
Pandas 教程

共15课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn