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

基于'serial no'列(忽略项顺序)去重的Pandas实现

Pandas实现忽略逗号分隔顺序的去重(基于serial no列)

问题背景

通过PostgreSQL的unnest函数导出的数据集存在大量重复记录,核心问题是serial no列中逗号分隔的项顺序不同(比如"A,B"和"B,A")被视为不同值,但实际属于同一组合,需要基于此规则去重,保留有效数据组合。

解决方案思路

核心是给serial no列生成一个标准化标识:将逗号分隔的字符串拆分、按固定顺序排序后重新拼接,这样不同顺序的同一组值会得到完全相同的标识。随后结合memberid、标准化标识、Serial列来判断重复项,最终去重并统一serial no的显示格式。

完整代码示例

import pandas as pd

# 模拟输入数据(实际场景可替换为从文件/数据库读取的数据集)
data = {
    "memberid": [1, 1, 1, 1],
    "serial no": ["A,B", "B,A", "A,B", "B,A"],
    "Serial": ["A", "B", "B", "A"]
}
df = pd.DataFrame(data)

# 生成标准化的serial no键:拆分、排序后重新拼接
df["standard_serial"] = df["serial no"].apply(lambda s: ",".join(sorted(s.split(","))))

# 基于memberid、标准化标识、Serial列去重,保留每组第一条记录
df_dedup = df.drop_duplicates(subset=["memberid", "standard_serial", "Serial"], keep="first")

# 统一serial no为标准化值,删除临时辅助列
df_dedup = df_dedup.assign(**{"serial no": df_dedup["standard_serial"]}).drop("standard_serial", axis=1)

# 重置索引(可选操作)
df_dedup = df_dedup.reset_index(drop=True)

print(df_dedup)

代码说明

  1. 标准化处理:通过lambda函数快速实现字符串拆分、排序、拼接,确保"A,B"和"B,A"这类顺序不同的相同组合生成一致的标识。
  2. 去重逻辑:drop_duplicates指定三个核心列作为去重依据,精准过滤掉顺序不同但实质重复的记录。
  3. 格式统一:最后将serial no替换为标准化后的值,保证输出格式的一致性,同时清理临时辅助列。

输出结果

运行代码后得到的结果与示例要求一致:

memberidserial noSerial
1A,BA
1A,BB

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:13:17