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

