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

Pandas如何查找DataFrame每行精确重复值并展示具体重复内容

逐行提取DataFrame重复值实现方案

需求背景

  • 待处理数据为120000行×40列的大型pandas DataFrame,需要逐行定位精确重复的非空值
  • 原有实现仅能新增布尔列标记行是否存在重复值,无法展示具体重复内容,原有代码如下:
import pandas as pd

df = pd.DataFrame({'col1':['1-233','2-766g','6-455','4-356','5-253','2-122','5-531','8-345','1-505','3-127','3-622'],
'col2':['6-998','2-766g','5-955','7-236','5-253','7-258','8-987t','7-567','1-505','6-876','NaN'],
'col3':['3-957','NaN','NaN','3-602m','1-266','2-122','7-834','8-345','2-858','7-984g', 'NaN']})

## 原有代码仅能输出布尔标记
df["duplicate"] = df.apply(lambda x: len(set(x[x.notna()])) != len(x[x.notna()]), axis=1)
print(df)

优化实现代码

核心逻辑是逐行统计非空值的出现频次,一次遍历同时完成「是否存在重复」的判断和「具体重复值」的提取,避免冗余计算,适配大表处理的性能要求:

import pandas as pd
from collections import Counter

# 读取你的实际DataFrame替换此处的示例df即可
df = pd.DataFrame({'col1':['1-233','2-766g','6-455','4-356','5-253','2-122','5-531','8-345','1-505','3-127','3-622'],
'col2':['6-998','2-766g','5-955','7-236','5-253','7-258','8-987t','7-567','1-505','6-876','NaN'],
'col3':['3-957','NaN','NaN','3-602m','1-266','2-122','7-834','8-345','2-858','7-984g', 'NaN']})

def fetch_row_duplicates(row):
    # 过滤空值避免干扰
    valid_entries = row[row.notna()].to_list()
    # 统计每个值的出现次数
    count_map = Counter(valid_entries)
    # 筛选出现次数≥2的重复值
    dup_items = [val for val, cnt in count_map.items() if cnt >= 2]
    # 同时返回重复标记和重复值列表
    return pd.Series([
        len(dup_items) > 0,
        dup_items if dup_items else None
    ])

# 一次性生成两列结果
df[["has_duplicate", "duplicate_values"]] = df.apply(fetch_row_duplicates, axis=1)
print(df)

效果说明

  • has_duplicate列和原有布尔标记逻辑完全一致,标识该行是否存在非空重复值
  • duplicate_values列以列表形式存储该行所有重复的具体值,无重复值的行对应位置为None
  • 如果需要更直观的字符串展示,可以把返回值里的dup_items替换为', '.join(dup_items),直接输出逗号拼接的重复值文本
  • 针对12万行×40列的数据规模,该实现无冗余计算,运行效率满足要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:54:17