PROJECT 08进阶
多源数据融合与主数据治理
Multi-source Data Fusion & MDM
整合多源异构数据,使用 merge/join/concat、模糊匹配与格式归一化。
merge/join/concat模糊匹配格式归一化冲突解决Golden Record
项目背景
某集团完成并购后,需要整合 3 个子公司的客户数据。各公司使用不同的客户标识体系、地址格式和命名规范,存在大量重复记录和冲突字段。
模拟数据集
source,client_id,name,email,phone,address,created_date
sys_a,A001,张三,zhangsan@email.com,13800138000,北京市朝阳区建国路88号,2023-01-15
sys_a,A002,李 四,lisi@email.com,13900139000,上海市浦东新区陆家嘴100号,2023-03-20
sys_b,B101,Zhang San,zhangsan@email.com,+86-138-0013-8000,北京朝阳建国路88号,2023-02-10
sys_b,B102,王五,wangwu@email.com,13700137000,广州市天河区天河路200号,2023-04-05
sys_c,C001,张三,zhang.san@email.com,13800138000,北京市朝阳区建国路88号,2023-01-20
sys_c,C002,赵六,zhaoliu@email.com,13600136000,深圳市南山区科技园300号,2023-05-12代码练习区
在下方编辑器中编写你的 Pandas 代码。可记录笔记、编写伪代码,参考答案在下方。
pandas_exercise.py
Loading...
参考答案
reference_solution.py
import pandas as pd
import re
from thefuzz import fuzz
df = pd.read_csv('client_data.csv')
# 1. 格式归一化 - 电话号码
def normalize_phone(phone):
phone = re.sub(r'[^\d+]', '', str(phone))
phone = phone.replace('+86', '')
return phone.zfill(11)
df['phone_norm'] = df['phone'].apply(normalize_phone)
# 2. 格式归一化 - 邮箱
df['email_norm'] = df['email'].str.lower().str.strip()
# 3. 格式归一化 - 姓名
df['name_norm'] = df['name'].str.replace(r'\s+', '', regex=True)
# 4. 地址标准化
df['address_norm'] = (df['address']
.str.replace('省', '')
.str.replace('市', '')
.str.replace('区', '')
.str.replace('路', '路')
.str.replace('号', '号'))
# 5. 基于多个字段的实体解析 (Record Linkage)
# 同一客户识别条件: 手机号相同 OR (邮箱相同 AND 姓名相似度 > 80)
df['name_match'] = df.groupby('email_norm')['name_norm'].transform(
lambda x: x.apply(lambda n: any(fuzz.ratio(n, other) > 80 for other in x if n != other))
)
# 6. 生成 Golden Record (合并去重)
golden = df.groupby(['phone_norm']).agg({
'client_id': lambda x: ','.join(sorted(x)),
'name': 'first',
'email': 'first',
'address': 'first',
'source': lambda x: ','.join(x),
'created_date': 'min'
}).reset_index()业务解读
主数据治理 (MDM) 是企业数据基建的核心。多源数据融合的关键在于 '实体解析' (Entity Resolution) —— 确定不同系统中的记录是否指向同一实体。模糊匹配 (fuzzy matching) 处理拼写差异,规则引擎定义匹配策略。Golden Record 是 '单一客户视图' 的基础。