如何在 Pandas 中按行识别并提取重复值

发布时间 - 2026-01-21 00:00:00    点击率:

本文介绍如何使用 `pandas.dataframe.apply()` 配合自定义逻辑,高效实现**逐行检测重复值**,并以字符串或集合形式返回每行中出现频次大于 1 的所有元素。

在 Pandas 中,默认的 duplicated() 方法作用于列(即纵向),常用于标记或筛选列方向上的重复行;但当需求变为横向识别每行内部的重复值(例如:某一行中 "bar" 出现两次,则提取 "bar"),就需要转向 apply(axis=1) 的行级操作。

核心思路是:对每一行(Series 对象),统计各元素出现次数,筛选出频次 > 1 的值,并去重汇总。以下是推荐的实现方式:

import pandas as pd

df2 = pd.DataFrame({
    "A": ["foo", "foo", "foo", "bar"],
    "B": [0, 1, 1, 1],
    "C": ["A", "foo", "B", "bar"],
    "D": ["bar", "bar", "B", "foo"],
    "E": ["bar", "bar", "B", "foo"]
})

# ✅ 推荐方案:返回 set(自动去重 + 无序),语义清晰且性能合理
df2["dup"] = df2.apply(
    lambda row: {val for val in row if row.tolist().count(val) > 1},
    axis=1
)

输出结果为:

     A  B    C    D    E         dup
0  foo  0    A  bar  bar       {bar}
1  foo  1  foo  bar  bar  {foo, bar}
2  foo  1    B    B    B         {B}
3  bar  1  bar  foo  foo  {foo, bar}

如需与示例中一致的逗号分隔字符串格式(如 "foo, bar"),可进一步转换:

df2["dup"] = df2["dup"].apply(lambda s: ", ".join(sorted(map(str, s))) if s else "")

⚠️ 注意事项:

  • row.tolist().count(val) 在大数据集上效率较低(时间复杂度 O(n²)),若处理超万行数据,建议改用 collections.Counter 优化:
    from collections import Counter
    df2["dup"] = df2.apply(
        lambda row: {val for val, cnt in Counter(row).items() if cnt > 1},
        axis=1
    )
  • 混合数据类型(如 int 和 str)时,Counter 更健壮;而 == 比较在 NaN 存在时需额外处理(NaN != NaN),如含缺失值,建议先用 row.fillna("MISSING") 统一占位。
  • 若需保留首次出现顺序,可用 dict.fromkeys(...) 去重后转 li

    st,再过滤。

该方法灵活、可读性强,适用于探索性分析及清洗阶段的行级模式识别任务。


# 大数据  # app  # pandas  # 数据类型  # count  # 字符串  # int  # 对象  # 首次  # 两次  # 适用于  # 自定义  # 较低  # 并以  # 如需  # 再过  # 先用  # 如何使用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Bootstrap整体框架之CSS12栅格系统  ,怎么在广州志愿者网站注册?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel怎么在Blade中安全地输出原始HTML内容  如何在万网利用已有域名快速建站?  EditPlus中的正则表达式 实战(4)  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  详解Android图表 MPAndroidChart折线图  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  长沙做网站要多少钱,长沙国安网络怎么样?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  米侠浏览器网页背景异常怎么办 米侠显示修复  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何批量查询域名的建站时间记录?  如何在万网ECS上快速搭建专属网站?  BootStrap整体框架之基础布局组件  javascript基于原型链的继承及call和apply函数用法分析  如何在IIS中新建站点并解决端口绑定冲突?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  郑州企业网站制作公司,郑州招聘网站有哪些?  Python函数文档自动校验_规范解析【教程】  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Python文件异常处理策略_健壮性说明【指导】  Python面向对象测试方法_mock解析【教程】  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  如何在 Pandas 中基于一列条件计算另一列的分组均值  JavaScript Ajax实现异步通信  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  利用python获取某年中每个月的第一天和最后一天  Linux系统命令中tree命令详解  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  如何用搬瓦工VPS快速搭建个人网站?  Java类加载基本过程详细介绍  如何用好域名打造高点击率的自主建站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  EditPlus 正则表达式 实战(3)  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何在Windows虚拟主机上快速搭建网站?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  如何在建站宝盒中设置产品搜索功能?