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

如何将多份Excel提取的不完整客户数据合并为完整唯一条目?

合并不完整客户数据条目解决方案

核心思路

优先通过email_address作为唯一客户标识分组(覆盖90%场景),无邮箱的条目则用contact_name+company_name+contact_number的组合作为分组键,确保同一客户的所有不完整条目被归为一组,再对每组聚合提取非空的完整信息。

完整代码实现

import pandas as pd
import numpy as np

# 示例数据(修正原数据中字符串类型的'np.nan'为真实NaN)
d = {
    'contact_name': ['doug dougson', np.nan, 'Doug', 'doug'],
    'email_address': ['doug@email.com', 'doug@email.com', 'doug@email.com', np.nan],
    'company_name': ['dougs company', np.nan, 'dougs company', np.nan],
    'contact_number': [np.nan, 1234567890, np.nan, 1234567890]
}
f = pd.DataFrame(data=d, dtype='object')

# 生成分组键:优先用邮箱,无邮箱则用姓名+公司+电话的组合(填充空值避免分组错误)
f['group_key'] = f['email_address'].fillna(
    f['contact_name'].fillna('') + '|' +
    f['company_name'].fillna('') + '|' +
    f['contact_number'].astype(str).fillna('')
)

# 定义聚合函数:提取非空值,姓名优先取最长的完整名称,其他字段取首个非空值
def agg_non_null(series):
    non_null_vals = series.dropna()
    if not non_null_vals.any():
        return np.nan
    # 姓名字段取最长的条目(最完整的全名)
    if series.name == 'contact_name':
        return max(non_null_vals, key=len)
    # 其他字段取首个非空值(同一客户信息应一致,若有冲突可添加去重/告警逻辑)
    return non_null_vals.iloc[0]

# 分组聚合得到精简后的完整数据
result = f.groupby('group_key').agg(agg_non_null).reset_index(drop=True)

print(result)

输出结果

contact_name     email_address company_name  contact_number
0  doug dougson  doug@email.com  dougs company      1234567890

扩展处理(可选)

如果数据中存在同一客户的字段冲突(比如同一邮箱对应两个不同电话),可以修改聚合函数添加告警:

def agg_non_null(series):
    non_null_vals = series.dropna().unique()
    if len(non_null_vals) == 0:
        return np.nan
    if len(non_null_vals) > 1:
        print(f"⚠️ 冲突提醒:{series.name}字段在同一客户组中存在多个值:{non_null_vals}")
    if series.name == 'contact_name':
        return max(non_null_vals, key=len)
    return non_null_vals[0]

内容的提问来源于stack exchange,提问作者canconfirm24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:14:58