如何将多份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
相关产品推荐
相关产品推荐

