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

如何在Pandas中查找DataFrame选定列拼接值的重复项?

如何在Pandas DataFrame中查找指定列拼接值的重复项

嘿,我来帮你搞定这个需求!你的现有代码思路是可行的,但其实可以用更简洁高效的Pandas原生方法来实现,先给你拆解下原始代码的逻辑,再分享更优的方案~

你的原始代码逻辑拆解

你这段代码的核心思路是把目标列转成numpy矩阵,然后手动遍历每一行,将列a和b的内容拼接成字符串作为键,把对应的idx存入集合,最后筛选出集合长度≥2的键值对——这确实能找出拼接值重复的记录。原始代码如下:

import numpy as np
from collections import defaultdict

# converts the sub df into matrix
mat = df[['idx', 'a', 'b']].values
str_dict = defaultdict(set)
for x in np.ndindex(mat.shape[0]):
    concat = ''.join(str(x) for x in mat[x][1:]) # 拼接a和b作为键,idx作为对应的值
    str_dict[concat].update([mat[x][0]])
dups = {}
for key in str_dict.keys():
    dup = str_dict[key]
    if len(dup) < 2:
        continue
    dups[key] = dup

更高效的Pandas原生实现方式

不过手动循环处理大数据集时效率会偏低,我们可以直接用Pandas内置的分组功能来实现,代码更简洁,性能也更好:

方法一:创建拼接列后分组筛选

# 先把a和b转成字符串并拼接成新列
df['a_b_concat'] = df['a'].astype(str) + df['b'].astype(str)

# 分组筛选出拼接值重复的组,提取对应的idx集合并转成字典
dups = df.groupby('a_b_concat').filter(lambda x: len(x) >= 2)\
         .groupby('a_b_concat')['idx'].apply(set).to_dict()

方法二:直接按拼接逻辑分组(无需额外列)

如果你不想新增列,可以直接在分组时指定拼接规则:

# 按a和b的拼接值分组,收集对应的idx集合
temp_dict = df.groupby([df['a'].astype(str), df['b'].astype(str)])['idx'].apply(set).to_dict()
# 过滤掉只有单个idx的项,得到最终重复项
dups = {f"{k[0]}{k[1]}": v for k, v in temp_dict.items() if len(v) >= 2}

这两种方法都用了Pandas的向量化操作,比手动循环numpy矩阵的效率高很多,尤其是当你的DataFrame数据量较大时,优势会更明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:46:46