当前位置: 首页 > article >正文

别再只会用drop_duplicates了!Pandas duplicated()函数这5个高级用法,让你数据处理效率翻倍

解锁Pandas duplicated()函数的5个高阶技巧让重复数据处理更高效在数据分析的日常工作中重复数据就像隐藏在角落里的数据幽灵不仅会扭曲统计结果还会影响机器学习模型的训练效果。大多数数据分析师对drop_duplicates()函数了如指掌却忽视了它的侦察兵——duplicated()函数的真正威力。本文将带你突破基础用法的局限探索duplicated()在复杂业务场景下的高阶应用。1. 多维度重复检测subset参数的组合艺术处理真实业务数据时单列重复往往不是问题所在。想象一下电商订单数据同一用户ID可能有多条记录这很正常但同一用户在同一秒下单购买相同商品这可能是异常。这时就需要组合多列来判断业务意义上的真正重复。import pandas as pd # 模拟电商订单数据 orders pd.DataFrame({ user_id: [1001, 1001, 1002, 1003, 1001, 1002], product_id: [A1, B2, A1, C3, A1, A1], order_time: [2023-01-01 10:00, 2023-01-01 10:01, 2023-01-01 10:00, 2023-01-01 10:05, 2023-01-01 10:00, 2023-01-01 10:00], quantity: [1, 2, 1, 3, 1, 2] }) # 检测用户在同一秒订购同一商品的异常情况 time_format %Y-%m-%d %H:%M orders[order_minute] pd.to_datetime(orders[order_time]).dt.strftime(time_format) duplicate_mask orders.duplicated(subset[user_id, product_id, order_minute], keepFalse) print(可疑的重复订单) print(orders[duplicate_mask])关键技巧将时间戳转换为分钟/秒级精度避免毫秒级差异导致重复检测失效keepFalse会标记所有重复项包括第一条便于完整查看重复组结合业务逻辑选择检测列例如支付金额通常不应作为重复判断依据2. 动态阈值控制基于出现次数的灵活筛选业务中常遇到这样的需求保留出现N次以上的记录比如活跃用户而不是简单的去重。传统的drop_duplicates()难以实现这种动态阈值控制而duplicated()配合groupby可以优雅解决。# 用户登录日志数据 logins pd.DataFrame({ user_id: [101, 102, 101, 103, 101, 102, 104, 102, 101], login_date: [2023-01-01, 2023-01-01, 2023-01-02, 2023-01-02, 2023-01-03, 2023-01-03, 2023-01-04, 2023-01-05, 2023-01-06] }) # 统计每个用户登录次数 login_counts logins[user_id].value_counts().reset_index() login_counts.columns [user_id, login_count] # 找出登录超过3次的活跃用户 active_users login_counts[login_counts[login_count] 3][user_id] active_logins logins[logins[user_id].isin(active_users)] print(活跃用户登录记录) print(active_logins)更高效的做法是使用duplicated()的keep参数实现# 使用duplicated实现阈值筛选 N 3 # 最小出现次数 logins[is_dupe] logins.duplicated(subset[user_id], keepFalse) user_counts logins.groupby(user_id).size() valid_users user_counts[user_counts N].index result logins[logins[user_id].isin(valid_users)] print(优化后的活跃用户筛选) print(result)性能对比方法执行时间(ms)内存使用(MB)适用场景value_counts isin12.35.2数据量中等duplicated groupby8.74.1大数据量循环计数152.67.8不推荐提示当数据量超过100万行时第二种方法的性能优势会更加明显3. 索引重复检测与处理容易被忽视的陷阱DataFrame的索引重复不会自动触发duplicated()的检测这是一个常见的坑。特别是在处理时间序列数据时索引重复可能导致聚合操作出错。# 创建有重复索引的DataFrame dates pd.to_datetime([2023-01-01, 2023-01-02, 2023-01-01, 2023-01-03]) temp_data pd.DataFrame({ temperature: [22, 23, 22.5, 21], humidity: [45, 50, 48, 42] }, indexdates) print(原始数据) print(temp_data) # 检测索引重复 print(\n重复索引位置) print(temp_data.index.duplicated()) # 解决方法1重置索引 df_reset temp_data.reset_index() # 解决方法2使用loc避免重复索引问题 daily_avg temp_data.loc[~temp_data.index.duplicated(keepfirst)] print(\n处理后数据) print(daily_avg)索引处理的最佳实践在读取数据后立即检查df.index.is_unique对于时间序列数据考虑使用asfreq()或resample()替代简单去重合并数据时特别注意join操作可能产生的索引重复4. 条件替换与标记超越简单删除的解决方案不是所有重复数据都应该删除。有时我们需要根据重复状态进行条件替换或标记这正是duplicated()的用武之地。场景示例处理调查问卷数据同一用户多次提交需要保留最新记录但需要标记修订历史。# 问卷数据 surveys pd.DataFrame({ respondent_id: [A1, A2, A1, A3, A2], submission_time: [09:00, 09:15, 09:30, 09:45, 10:00], q1: [3, 4, 5, 2, 4], q2: [Yes, No, No, Yes, Maybe] }) # 转换为时间类型便于排序 surveys[submission_time] pd.to_datetime(surveys[submission_time]) # 标记所有重复提交包括最新记录 surveys[is_duplicate] surveys.duplicated(subset[respondent_id], keepFalse) # 标记修订版本 surveys[revision] surveys.groupby(respondent_id).cumcount() 1 # 获取每个用户的最新回答 latest_answers surveys.sort_values(submission_time).drop_duplicates( subset[respondent_id], keeplast) print(完整的问卷提交历史) print(surveys) print(\n最终采用的答案) print(latest_answers[[respondent_id, q1, q2]])进阶技巧结合where和mask实现条件替换# 将非最新版本的q1回答标记为无效 surveys[valid_q1] surveys[q1].where( ~surveys.duplicated(subset[respondent_id], keeplast), otherNone ) print(\n有效性标记结果) print(surveys[[respondent_id, q1, valid_q1]])5. 与其它Pandas方法的组合技duplicated()真正的威力在于与其他Pandas方法的组合使用。以下是几个实用案例案例1重复数据分箱处理# 销售数据 sales pd.DataFrame({ product_id: [P1, P2, P1, P3, P2, P4, P1], sale_amount: [100, 150, 120, 200, 130, 300, 110] }) # 对重复销售记录按金额分箱 sales[dupe_group] sales.groupby(product_id).ngroup() sales[amount_bin] pd.cut( sales[sale_amount], bins[0, 120, 150, 200, 300], labels[Low, Medium, High, Premium] ) print(分箱处理结果) print(sales)案例2基于重复状态的聚合计算# 添加重复标记 sales[is_dupe] sales.duplicated(subset[product_id], keepFalse) # 计算重复产品的平均销售额 dupe_products sales[sales[is_dupe]] avg_sale_by_product dupe_products.groupby(product_id)[sale_amount].mean() print(\n重复产品平均销售额) print(avg_sale_by_product)案例3与sort_values的完美配合# 找出价格波动最大的重复产品 sales_sorted sales.sort_values([product_id, sale_amount]) sales_sorted[price_range] sales_sorted.groupby(product_id)[sale_amount].transform( lambda x: x.max() - x.min() ) print(\n价格波动分析) print(sales_sorted.drop_duplicates(subset[product_id], keeplast))性能优化小贴士在大数据集上先sort_values再duplicated通常比相反顺序更快对字符串列使用astype(category)可以显著提升重复检测速度考虑使用numba加速复杂的重复检测逻辑

相关文章:

别再只会用drop_duplicates了!Pandas duplicated()函数这5个高级用法,让你数据处理效率翻倍

解锁Pandas duplicated()函数的5个高阶技巧:让重复数据处理更高效 在数据分析的日常工作中,重复数据就像隐藏在角落里的"数据幽灵",不仅会扭曲统计结果,还会影响机器学习模型的训练效果。大多数数据分析师对drop_duplic…...

C# 13拦截器实战指南:如何在金融级交易服务中实现无侵入日志、熔断与权限校验(附IL织入对比基准)

更多请点击: https://intelliparadigm.com 第一章:C# 13拦截器在金融级交易服务中的定位与价值 C# 13 引入的拦截器(Interceptors)并非传统意义上的运行时 AOP 工具,而是一种编译期重写机制——它允许开发者在调用特定…...

【C++27 constexpr 极致优化权威指南】:20年编译器专家亲授7大突破性技巧,绕过ISO WG21未公开限制

更多请点击: https://intelliparadigm.com 第一章:C27 constexpr 函数极致优化的底层范式跃迁 C27 将 constexpr 的语义边界彻底重构——它不再仅是编译期求值的“标记”,而成为统一编译期与运行期执行模型的**元执行契约(Meta-E…...

Java虚拟线程与Project Loom深度绑定指南:从编译期协程支持到JFR事件追踪(JDK21 GA后唯一权威路径)

更多请点击: https://intelliparadigm.com 第一章:Java虚拟线程与Project Loom的演进本质 Java 虚拟线程(Virtual Threads)是 Project Loom 的核心成果,标志着 JVM 并发模型从“操作系统线程绑定”向“轻量级协作调度…...

Java服务网格配置性能断崖式下跌?用Arthas+Prometheus定位ConfigMap热更新延迟的11ms真相

更多请点击: https://intelliparadigm.com 第一章:Java服务网格配置 在现代云原生架构中,Java应用接入服务网格(Service Mesh)需兼顾兼容性、可观测性与流量控制能力。Istio 是最广泛采用的控制平面,而 Ja…...

如何高效实现抖音内容批量下载:技术架构与实践指南

如何高效实现抖音内容批量下载:技术架构与实践指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...

零刻EQ12 N100小主机变身家庭网络中枢:保姆级ESXi 8.0U2 + iKuai + OpenWrt + 黑群晖7.2全栈部署避坑指南

零刻EQ12 N100家庭网络中枢全栈部署实战指南 在智能家居和远程办公日益普及的今天,一个稳定高效的家庭网络中枢已成为现代家庭的刚需。零刻EQ12 N100凭借其紧凑的机身、双2.5G网口和出色的能耗比,成为搭建All In One家庭服务器的理想选择。不同于简单的分…...

【仅限头部SaaS厂商内部流出】PHP 8.9 JIT火焰图调优手册:定位热点函数、规避Tracing失效、绕过x86_64指令对齐坑

更多请点击: https://intelliparadigm.com 第一章:PHP 8.9 JIT 编译器生产级调优教程 PHP 8.9(预发布版)对内置的 Zend JIT 编译器进行了关键性增强,包括函数内联策略优化、寄存器分配器重写及内存屏障指令插入支持&a…...

Godot-MCP终极指南:用AI对话开发游戏的5个惊人技巧

Godot-MCP终极指南:用AI对话开发游戏的5个惊人技巧 【免费下载链接】Godot-MCP An MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude 项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP Godot-MC…...

【.NET 9低代码配置终极指南】:20年微软生态专家亲授,3大核心配置模式+5个避坑红线

更多请点击: https://intelliparadigm.com 第一章:.NET 9低代码配置的演进逻辑与本质认知 .NET 9 将低代码能力深度融入平台原生配置体系,其演进并非简单封装可视化拖拽,而是以“声明即契约、配置即契约实现”为内核,…...

C# 13模块化开发稀缺资源包:12个生产环境验证的顶级语句模块模板(含CI/CD集成配置与SonarQube规则集)

更多请点击: https://intelliparadigm.com 第一章:C# 13模块化开发核心范式演进 C# 13 引入了原生模块(module)声明语法与细粒度程序集可见性控制,标志着 .NET 平台正式迈入显式模块化时代。不同于传统 AssemblyInfo…...

Hypergrep:现代代码搜索工具的设计原理与工程实践

1. 项目概述:一个为现代开发者打造的极速代码搜索工具如果你和我一样,每天有超过一半的时间是在代码仓库里“寻宝”——寻找某个函数定义、追踪某个变量的所有引用、或者在一堆日志文件中定位特定的错误信息——那么你一定对grep这个老牌工具又爱又恨。爱…...

Windows系统优化终极指南:5分钟掌握WinUtil高效管理技巧

Windows系统优化终极指南:5分钟掌握WinUtil高效管理技巧 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 你是否厌倦了Windows系统…...

终极指南:如何使用Harepacker复活版轻松编辑MapleStory游戏资源

终极指南:如何使用Harepacker复活版轻松编辑MapleStory游戏资源 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected 你是否曾经想过自…...

2025届学术党必备的六大降重复率方案横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下,在学术写作跟内容创作里头,把文本的AI生成痕迹给降低&#xff0…...

告别背包焦虑!TQVaultAE:泰坦之旅玩家的终极装备管理解决方案

告别背包焦虑!TQVaultAE:泰坦之旅玩家的终极装备管理解决方案 【免费下载链接】TQVaultAE Extra bank space for Titan Quest Anniversary Edition 项目地址: https://gitcode.com/gh_mirrors/tq/TQVaultAE 还在为《泰坦之旅》中的背包空间不足而…...

21st.dev:社区驱动的React组件注册中心,基于shadcn/ui与Tailwind CSS

1. 项目概述:21st.dev,一个面向未来的React组件社区如果你和我一样,每天都在和React、Tailwind CSS打交道,那你肯定也经历过这样的时刻:为了一个漂亮的按钮、一个顺滑的弹窗,或者一个复杂的表单组件&#x…...

从Open3D到CloudCompare:手把手教你用两种工具搞定点云距离分析(附代码对比)

从Open3D到CloudCompare:点云距离分析的跨平台实战指南 在三维数据处理领域,点云距离分析是检测物体形变、评估重建精度、进行质量控制的基石操作。当开发者需要在Python生态的Open3D与专业桌面软件CloudCompare之间切换时,往往面临工具链割裂…...

基于MCP协议实现AI助手与Intervals任务管理的无缝集成

1. 项目概述:当你的AI助手能直接管理你的任务系统如果你和我一样,日常开发工作流里离不开Intervals这样的任务管理工具,同时又重度依赖Claude、Cursor这类AI编程助手,那你肯定也幻想过:要是能让AI直接帮我查任务、更新…...

深入理解Mybatis

什么是Mybatis? MyBatis呢,是Java领域中的一款持久化框架,它的主要功能是,让我们能够轻松地在Java对象和数据库之间建立联系。通过这种联系,开发者可以很方便地存储、检索和操作数据。MyBatis与其他ORM框架相比,有一些独有的特点。 首先,MyBatis强调对SQL的可控…...

视频速度控制器:重塑数字时代的高效观看体验

视频速度控制器:重塑数字时代的高效观看体验 【免费下载链接】videospeed HTML5 video speed controller (for Google Chrome) 项目地址: https://gitcode.com/gh_mirrors/vi/videospeed 在信息爆炸的数字时代,视频已成为获取知识、参与会议和享受…...

ADAS开发避坑指南:FCW前方碰撞预警的‘不报警’条件全解析与实战标定

ADAS开发实战:FCW前方碰撞预警的7类静默逻辑与参数标定艺术 清晨的测试场弥漫着露水气息,工程师老王紧盯着监控屏幕——第37次弯道测试中,FCW系统再次在入弯时误报了前方静止车辆。这不是简单的算法漏洞,而是隐藏在GB/T 33577标准…...

避坑指南:手把手教你用Python复现股票软件的副图指标(MA/MACD/成交量)并解决配置文件路径报错

Python金融数据可视化实战:从K线到MACD的完整复现指南 金融数据可视化是量化交易和投资分析的基础技能之一。对于刚接触Python金融分析的开发者来说,复现专业股票软件的图表功能往往充满挑战——从路径配置报错到指标计算逻辑,每一步都可能成…...

Python 3.6/3.7虚拟环境创建卡在ensurepip?一份针对老版本Python的venv避坑指南

Python 3.6/3.7虚拟环境创建卡在ensurepip?一份针对老版本Python的venv避坑指南 在企业级开发环境中,我们常常会遇到需要维护历史遗留项目的情况。这些项目可能因为依赖关系或兼容性问题,不得不运行在Python 3.6或3.7等较旧版本上。最近在为某…...

别再死记硬背了!用Python的NumPy库5分钟搞定矩阵特征值与特征向量计算

用NumPy实战矩阵特征值计算:5分钟从理论到可视化 记得第一次接触特征值和特征向量时,教授在黑板上写满了行列式展开式,而台下的我们盯着那一堆λ符号面面相觑。直到在机器学习课程中真正需要用到PCA降维时,才意识到这个看似抽象的…...

Go 文件与 I/O 操作完全指南

引言文件操作是任何编程语言都必须掌握的基础技能,Go 语言在这方面的设计简洁而强大。Go 的 I/O 操作主要围绕 io、os、ioutil、bufio 和 fmt 这几个核心包展开。标准库的设计遵循 Unix 哲学:一个工具做好一件事,通过组合实现复杂功能。本文将…...

别再手动复制DLL了!Qt Creator + CMake一键配置OpenCV库(附完整CMakeLists.txt)

Qt Creator CMake自动化部署OpenCV:告别手动复制DLL的终极方案 每次在Windows平台集成OpenCV这类带DLL的第三方库时,开发者最头疼的莫过于运行时提示"缺少xxx.dll"。传统解决方案是手动复制DLL到可执行文件目录,这不仅效率低下&am…...

告别tkinter!用PyCharm+PySide6快速搭建你的第一个桌面应用(附完整代码)

从Tkinter到PySide6:现代Python GUI开发实战指南 在Python GUI开发领域,Tkinter长期占据着入门级工具的位置,但随着应用复杂度提升,开发者们常常会遇到它的性能瓶颈和功能限制。PySide6作为Qt官方Python绑定,不仅继承了…...

为AI智能体构建长期记忆系统:基于LanceDB向量数据库的RAG实战

1. 项目概述:当记忆检索遇上开源智能体最近在折腾AI智能体(Agent)时,我遇到了一个几乎所有开发者都会头疼的经典问题:上下文窗口限制。无论是基于GPT-4还是Claude,模型能“记住”的对话历史和知识都是有限的…...

从Vim叛逃到Nano:一个运维老兵的服务器文本编辑实战心得

从Vim叛逃到Nano:一个运维老兵的服务器文本编辑实战心得 凌晨三点,服务器告警短信像催命符一样震动手机。我顶着睡意连上跳板机,却发现网络延迟高达800ms——这种场景下,Vim的模式切换和组合键突然变得像解摩斯密码。当手指下意识…...