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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:02:18