使用Pandas为符合条件的重复客户数据分配唯一序列号
用Pandas高效处理重复客户数据并生成唯一序列号
当然可以用Pandas的内置函数搞定这个需求,而且处理20万行数据的效率会比嵌套循环高几个数量级,完全不用再卡半天。以下是具体的实现步骤:
需求明确
现有大型客户数据库,字段包括CustomerID、FirstName、LastName、DoB、VAT Number等,需要处理Excel文件并新增S/N列:只要两条记录的姓名(FirstName+LastName)相同,并且出生日期(DoB)或者税号(VAT Number)任意一项重复,就判定为同一组重复数据,分配同一个唯一序列号。
实现步骤
1. 读取Excel数据
先把数据读进Pandas DataFrame:
import pandas as pd df = pd.read_excel("customer_data.xlsx")
2. 构建重复分组标识
核心思路是先把符合规则的记录归为同一组,再给每组分配序列号:
- 首先合并姓名字段,方便后续按姓名分组
- 分别按「姓名+出生日期」、「姓名+税号」分组,得到两个分组ID
- 合并这两个分组ID:只要任意一个分组ID相同,就属于同一重复组
- 最后给每个合并后的分组分配唯一序列号
代码实现:
# 合并FirstName和LastName为全名,简化分组操作 df["FullName"] = df["FirstName"] + " " + df["LastName"] # 按「全名+DoB」生成分组ID df["dob_group_id"] = df.groupby(["FullName", "DoB"]).ngroup() # 按「全名+VAT Number」生成分组ID df["vat_group_id"] = df.groupby(["FullName", "VAT Number"]).ngroup() # 用frozenset组合两个分组ID,确保两个分组ID只要有一个相同就归为一组 df["repeat_group"] = df.apply(lambda row: frozenset([row["dob_group_id"], row["vat_group_id"]]), axis=1) # 给每个重复组分配唯一的S/N(从1开始计数) df["S/N"] = df.groupby("repeat_group").ngroup() + 1
3. 处理空值(可选但重要)
如果你的VAT Number字段存在空值,直接分组会把所有空值的记录归为同一组,这显然不对。可以用CustomerID(唯一值)填充空值,避免误判:
# 把VAT Number的空值替换成对应的CustomerID字符串 df["VAT Number"] = df["VAT Number"].fillna(df["CustomerID"].astype(str))
4. 保存处理后的文件
最后把结果导出回Excel:
df.to_excel("processed_customer_data.xlsx", index=False)
效率说明
Pandas的分组操作都是底层C优化的,处理20万行数据基本几秒就能搞定,完全不用像嵌套循环那样卡很久。
内容的提问来源于stack exchange,提问作者Thanasis Koursaris
相关产品推荐
相关产品推荐

