0

0

python pandas如何删除重复行_pandas drop_duplicates()函数去重方法

下次还敢

下次还敢

发布时间:2025-09-23 21:11:01

|

1317人浏览过

|

来源于php中文网

原创

pandas的drop_duplicates()函数用于删除重复行,默认保留首次出现的记录并返回新DataFrame。通过subset参数可指定列进行去重,keep参数控制保留首条、末条或删除所有重复项,inplace决定是否修改原数据,ignore_index用于重置索引。

python pandas如何删除重复行_pandas drop_duplicates()函数去重方法

pandas库提供了一个极其便利且功能强大的drop_duplicates()函数,它是处理数据集中重复行的核心利器。简单来说,这个函数能根据你设定的规则,识别并移除那些完全相同或在特定列上重复的记录,确保你的数据保持独一无二的干净状态。

解决方案

pandas.DataFrame.drop_duplicates()是你在pandas中删除重复行的主要工具。它的基本用法非常直观,默认情况下会检查DataFrame中的所有列,如果发现某两行或多行在所有列上的值都完全相同,它会保留第一次出现的行,并删除后续的重复行。

让我们看一个基础的例子:

import pandas as pd
import numpy as np

# 创建一个包含重复数据的DataFrame
data = {
    'A': ['foo', 'bar', 'foo', 'bar', 'qux', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'one'],
    'C': [1, 2, 1, 3, 2, 1]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)

# 使用drop_duplicates()删除重复行
# 默认:检查所有列,保留第一次出现的重复行
df_deduplicated = df.drop_duplicates()
print("\n去重后的DataFrame (默认):")
print(df_deduplicated)

在这个例子中,('foo', 'one', 1)这行出现了两次,drop_duplicates()默认保留了第一个,移除了第二个。这个函数返回一个新的DataFrame,而不会修改原始DataFrame,除非你明确指定了inplace=True参数。

立即学习Python免费学习笔记(深入)”;

drop_duplicates()的强大之处在于它的灵活性,通过几个关键参数,你可以精确控制去重行为:

  • subset: 指定要用于识别重复行的列名列表。
  • keep: 指定保留哪条重复记录,可以是'first'(默认)、'last'False(删除所有重复项)。
  • inplace: 如果为True,则直接修改原始DataFrame并返回None
  • ignore_index: 如果为True,则在删除行后重置索引。

如何仅根据部分列进行去重,而不是整行?

很多时候,我们并不是要删除所有列都完全相同的行。比如,你可能有一个用户行为日志,里面记录了用户的每次操作,但你只想知道有哪些“独立用户”访问了某个页面,而不管他们访问了多少次。或者,你可能有一个订单列表,你只想确保每个订单号是唯一的,至于订单的其他细节,只要订单号唯一就行。这时,subset参数就显得尤为重要了。

使用subset参数,你可以传入一个包含列名的列表。drop_duplicates()会只关注这些指定的列,如果这些列的值组合重复了,那么它就认为这是一条重复记录。

# 假设我们只想根据'A'列和'B'列的组合来去重
# 比如,我们认为('foo', 'one')这个组合出现多次就算重复
df_subset_deduplicated = df.drop_duplicates(subset=['A', 'B'])
print("\n根据'A'和'B'列去重后的DataFrame:")
print(df_subset_deduplicated)

# 原始数据
#    A      B  C
# 0  foo    one  1
# 1  bar    one  2
# 2  foo    two  1
# 3  bar  three  3
# 4  qux    two  2
# 5  foo    one  1  <-- ('foo', 'one')重复

# 结果会保留第一条 ('foo', 'one'),删除第六条

这种用法在处理日志数据、用户会话或者任何需要基于特定标识符进行唯一性判断的场景下都非常实用。它提供了一种精细化的控制,避免了过度删除可能仍有价值的信息。我个人在处理用户画像数据时经常会用到这个,比如确保每个用户ID只对应一条最新的属性记录。

Insou AI
Insou AI

Insou AI 是一款强大的人工智能助手,旨在帮助你轻松创建引人入胜的内容和令人印象深刻的演示。

下载

去重时,如何选择保留哪条重复记录?是第一条还是最后一条?

drop_duplicates()keep参数决定了在遇到重复行时,我们究竟要保留哪一个。这个选择看似简单,但在实际数据处理中却常常需要仔细权衡,因为它直接影响了最终数据集的形态和信息偏向。

keep参数有三个选项:

  • 'first' (默认值): 保留第一次出现的重复行。
  • 'last': 保留最后一次出现的重复行。
  • False: 删除所有重复的行,也就是说,如果某行是重复的,那么它所有的副本都会被删除,只有那些完全不重复的行才会被保留下来。

让我们用例子来说明:

# 创建一个包含重复数据的DataFrame,这次我们让重复行有点差异,便于观察
data_keep = {
    'ID': [1, 2, 1, 3, 2, 1],
    'Value': ['A', 'B', 'C', 'D', 'E', 'F'],
    'Timestamp': [10, 20, 30, 40, 50, 60] # 模拟时间戳
}
df_keep = pd.DataFrame(data_keep)
print("\n原始DataFrame (含时间戳):")
print(df_keep)

# 根据'ID'列去重,保留第一次出现的记录
df_first = df_keep.drop_duplicates(subset=['ID'], keep='first')
print("\n根据'ID'去重,保留'first':")
print(df_first)
# ID 1, Value A, Timestamp 10 会被保留

# 根据'ID'列去重,保留最后一次出现的记录
df_last = df_keep.drop_duplicates(subset=['ID'], keep='last')
print("\n根据'ID'去重,保留'last':")
print(df_last)
# ID 1, Value F, Timestamp 60 会被保留

# 根据'ID'列去重,删除所有重复的记录 (只有ID=3是唯一的)
df_false = df_keep.drop_duplicates(subset=['ID'], keep=False)
print("\n根据'ID'去重,删除所有重复的记录 (keep=False):")
print(df_false)
# 只有ID=3的记录会被保留

在实际工作中,keep='first'通常是安全的默认选项,尤其当你只是想获取一个唯一列表时。但如果你的数据有明确的顺序性,比如日志记录或状态更新,并且你希望总是获取最新的信息,那么keep='last'就非常有用。举个例子,如果我有一系列用户状态更新,我通常会用keep='last'来确保我拿到的是用户当前最新的状态。至于keep=False,它在需要严格筛选出“绝对唯一”项的场景下非常有效,比如你想找出那些只出现过一次的异常事件。

去重操作会修改原始DataFrame吗?如何处理索引?

这是一个新手,甚至包括我自己刚开始用pandas时,经常会混淆的问题。默认情况下,drop_duplicates()函数并不会直接修改你原始的DataFrame。它会返回一个新的DataFrame,这个新的DataFrame包含了去重后的数据。这意味着如果你不把它的返回值赋给一个变量(包括原来的变量名),那么你的去重操作就“白做了”,原始DataFrame还是老样子。

# 假设我们有一个DataFrame
df_original = pd.DataFrame({'col1': [1, 2, 1], 'col2': ['A', 'B', 'A']})
print("原始DataFrame:")
print(df_original)

# 尝试去重,但不赋值
df_original.drop_duplicates()
print("\n去重操作后,但未赋值的原始DataFrame:")
print(df_original) # 发现df_original并没有改变

# 正确的做法:将去重结果赋值给一个新变量或覆盖原变量
df_deduplicated_new = df_original.drop_duplicates()
print("\n赋值给新变量后的去重DataFrame:")
print(df_deduplicated_new)

# 或者,使用inplace=True直接修改原始DataFrame
df_original_inplace = pd.DataFrame({'col1': [1, 2, 1], 'col2': ['A', 'B', 'A']})
print("\n使用inplace=True前的DataFrame:")
print(df_original_inplace)
df_original_inplace.drop_duplicates(inplace=True)
print("\n使用inplace=True后的DataFrame:")
print(df_original_inplace) # df_original_inplace已被修改

关于索引,drop_duplicates()在删除行后,默认会保留原始行的索引。这意味着如果第0行和第2行是重复的,删除了第2行后,DataFrame的索引可能就不再是连续的了(比如,0, 1, 3, 4...)。在某些情况下,这可能是你想要的,因为它保留了原始数据的“血统”。但更多时候,尤其是在进行后续的数据处理或分析时,一个连续的、重置的索引会更方便。

这时,ignore_index=True参数就派上用场了。当你设置ignore_index=True时,pandas会在删除重复行后,重新生成一个从0开始的、连续的整数索引。

df_indexed = pd.DataFrame({'col1': [1, 2, 1, 3], 'col2': ['A', 'B', 'A', 'C']})
print("\n去重前,有重复索引的DataFrame:")
print(df_indexed)

# 默认去重,不重置索引
df_default_index = df_indexed.drop_duplicates()
print("\n默认去重 (索引未重置):")
print(df_default_index)
# 索引会是 0, 1, 3

# 去重并重置索引
df_reset_index = df_indexed.drop_duplicates(ignore_index=True)
print("\n去重并重置索引 (ignore_index=True):")
print(df_reset_index)
# 索引会是 0, 1

理解inplaceignore_index这两个参数对于编写健壮且可预测的pandas代码至关重要。我个人的习惯是,除非我明确知道我需要修改原始DataFrame,否则我通常会避免使用inplace=True,而是将结果赋给一个新的变量,这样可以更好地控制数据流,减少意外修改的风险。至于索引,如果后续操作不依赖于原始索引,我通常会选择ignore_index=True,让索引保持整洁。

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

81

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

34

2026.01.31

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

325

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

293

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

179

2025.08.07

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

42

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

79

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

234

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号