pandas 重复数据处理大全(附代码)

简介: 继续更新pandas数据清洗,上一篇说到缺失值的处理。

继续更新pandas数据清洗,上一篇说到缺失值的处理。

链接:pandas 缺失数据处理大全(附代码)

感兴趣可以关注这个话题pandas数据清洗,第一时间看到更新。

所有数据和代码可在我的GitHub获取:

https://github.com/xiaoyusmd/PythonDataScience

本次来介绍重复值处理的常用方法。


重复值处理主要涉及两个部分,一个是找出重复值,第二个是删除重复值,也就是根据自己设定的条件进行删除操作。


定位重复值


对于重复值,我们首先需要查看这些重复值是什么样的形式,然后确定删除的范围,而查询重复值需要用到duplicated函数。

duplicated的返回值是布尔值,返回TrueFalse,默认情况下会按照一行的所有内容进行查重。

主要参数:

  • subset:如果不按照全部内容查重,那么需要指定按照哪些列进行查重。比如按照姓名进行查重subset=['name'],那么具有相同名字的人就只会保留一个,但很可能只是重名的原因,而并非真正同一个人,所以可以按照姓名和出生日期两列查重,subset=['name','birthday'],同理还可以再添加列,这样就可以基本保证去重效果了。
  • keep:用来确定要标记的重复值,可以设置为firstlastFalse
  • first:除第一次出现的重复值,其他都标记为True
  • last:除最后一次出现的重复值,其他都标记为True
  • False:所有重复值都标记为True

实例:


import pandas as pd
import numpy as np
data = {
    'user' : ['zszxz','zszxz','rose'],
    'price' : [100, 200, -300],
    'hobby' : ['reading','reading','hiking']
}
frame  = pd.DataFrame(data)
print(frame)
------------------------
    user  price    hobby
0  zszxz    100  reading
1  zszxz    200  reading
2   rose   -300   hiking
------------------------
frame.duplicated()
----------
0    False
1    False
2    False
dtype: bool
-----------


上面提到duplicated返回布尔值,所以如果要想输出这些重复值,还需要和查询的方法配合使用df[df.duplicated()],比如:


# 1、按user变量筛选重复值
frame[frame.duplicated(subset=['user'])]
-------------------
  user price hobby
1 zszxz 200 reading
-------------------


上面按user一个变量进行查重,但没有设置keep参数,所以默认筛选出除了第一个以外的其它重复值。


# 2、按user变量筛选重复值,保留全部重复值
frame[frame.duplicated(subset=['user'], keep=False)]
-------------------
  user price hobby
0 zszxz 100 reading
1 zszxz 200 reading
-------------------


上面按user一个变量进行查重,并设置keep参数为False,所以保留了全部的重复值。


# 3、按user和hobby变量筛选重复值,筛选出除最后一个重复值以外的其它重复值
frame[frame.duplicated(subset=['user','hobby'], keep='last')]
-------------------
  user price hobby
0 zszxz 100 reading
-------------------

上面按userhobby两个变量进行查重,并设置keep参数为last,所以筛选出了除最后一个重复值以外的其它重复值。

通过两个参数的设置就可以查看自己想要的重复值了,以此判断要删除哪个,保留哪个。


删除重复值


当确定好需要删除的重复值后,就进行进行删除的操作了。

删除重复值会用到drop_duplicates函数。

duplicated()函数参数类似,主要有3个参数:

  • subset:同duplicated(),设置去重的字段
  • keep: 这里稍有不同,duplicated()中是将除设置值以外重复值都返回True,而这里是保留的意思。同样可以设置firstlastFalse
  • first:保留第一次出现的重复行,删除其他重复行
  • last:保留最后一次出现的重复行,删除其他重复行
  • False:删除所有重复行
  • inplace:布尔值,默认为False,是否直接在原数据上删除重复项或删除重复项后返回副本。

实例:


1、全部去重


# 按全部字段删除,在原数据frame上生效
frame.drop_duplicates(inplace=True)
print(frame)
------------------------
    user  price    hobby
0  zszxz    100  reading
1  zszxz    200  reading
2   rose   -300   hiking
------------------------

因为上面数据中没有全部重复的,因此没有可删除行。


2、指定列去重


# 按user字段删除,在原数据frame上生效
frame.drop_duplicates(subset=['user'],inplace=True)
print(frame)
------------------------
    user  price    hobby
0  zszxz    100  reading
2   rose   -300   hiking
------------------------


上面按user字段删除重复行,保留第一个重复行,因此第二行被删除了。但这里大家注意下,执行删除重复行操作后,表的索引也会被删掉。

如需要重置可以加上reset_index(),设置drop=True,用索引替代被打乱的索引。


frame.drop_duplicates(subset=['user'],inplace=True)
frame.reset_index(drop=True)
------------------------
    user  price    hobby
0  zszxz    100  reading
1   rose   -300   hiking
------------------------


keep默认为first,下面手动设置为last,只保留最后一个重复行。


# 按全部字段删除,在原数据frame上生效
frame.drop_duplicates(subset=['user','hobby'],keep='last',inplace=True)
print(frame)
------------------------
    user  price    hobby
1  zszxz    200  reading
2   rose   -300   hiking
------------------------


keep手动设置为False,全部删除,这种一般很少用。


# 按全部字段删除,在原数据frame上生效
frame.drop_duplicates(subset=['user','hobby'],keep=False,inplace=True)
print(frame)
------------------------
    user  price    hobby
2   rose   -300   hiking
------------------------


以上就是重复值相关的所有操作。


注意事项


在删除重复值时,要注意下删除的逻辑。

因为很多时候我们需要把这些离线的清洗操作在线上复现。

如果我们随机地删除重复行,没有明确的逻辑,那么对于这种随机性线上是无法复现的,即无法保证清洗后的数据一致性。

所以我们在删除重复行前,可以把重复判断字段进行排序处理。

比如上面例子中,如果要对userprice去重,那么比较严谨的做法是按照userprice进行排序。


frame.sort_values(by=['user','price'],ascending=True).reset_index(drop=True)
--------------------
  user price hobby
0 rose -300 hiking
1 zszxz 100 reading
2 zszxz 200 reading
--------------------


因为有了排序性,只要按这个逻辑它的顺序是固定的,而不是随机的。所以无论我们设置keepfirst还是last,都没有任何影响。


以上是本次分享。原创不易,欢迎点赞、在看支持。

目录
打赏
0
0
0
0
7
分享
相关文章
Pandas高级数据处理:数据流式计算
本文介绍了如何使用 Pandas 进行流式数据处理。流式计算能够实时处理不断流入的数据,适用于金融交易、物联网监控等场景。Pandas 虽然主要用于批处理,但通过分块读取文件、增量更新 DataFrame 和使用生成器等方式,也能实现简单的流式计算。文章还详细讨论了内存溢出、数据类型不一致、数据丢失或重复及性能瓶颈等常见问题的解决方案,并建议在处理大规模数据时使用专门的流式计算框架。
366 100
Pandas高级数据处理:数据流式计算
Pandas高级数据处理:交互式数据探索
Pandas 是数据分析中常用的数据处理库,提供了强大的数据结构和操作功能。本文从基础到高级,逐步介绍 Pandas 中交互式数据探索的常见问题及解决方案,涵盖数据读取、检查、清洗、预处理、聚合分组和可视化等内容。通过实例代码,帮助用户解决文件路径错误、编码问题、数据类型不一致、缺失值处理等挑战,提升数据分析效率。
134 32
Pandas高级数据处理:数据仪表板制作
《Pandas高级数据处理:数据仪表板制作》涵盖数据清洗、聚合、时间序列处理等技巧,解决常见错误如KeyError和内存溢出。通过多源数据整合、动态数据透视及可视化准备,结合性能优化与最佳实践,助你构建响应快速、数据精准的商业级数据仪表板。适合希望提升数据分析能力的开发者。
108 31
Pandas高级数据处理:数据安全与隐私保护
在数据驱动的时代,数据安全和隐私保护至关重要。本文探讨了使用Pandas进行数据分析时如何确保数据的安全性和隐私性,涵盖法律法规要求、用户信任和商业价值等方面。通过加密、脱敏、访问控制和日志审计等技术手段,结合常见问题及解决方案,帮助读者在实际项目中有效保护数据。
109 29
Pandas高级数据处理:数据仪表板制作
在数据分析中,面对庞大、多维度的数据集(如销售记录、用户行为日志),直接查看原始数据难以快速抓住重点。传统展示方式(如Excel表格)缺乏交互性和动态性,影响决策效率。为此,我们利用Python的Pandas库构建数据仪表板,具备数据聚合筛选、可视化图表生成和性能优化功能,帮助业务人员直观分析不同品类商品销量分布、省份销售额排名及日均订单量变化趋势,提升数据洞察力与决策效率。
81 12
Pandas高级数据处理:数据可视化进阶
Pandas是数据分析的强大工具,能高效处理数据并与Matplotlib、Seaborn等库集成,实现数据可视化。本文介绍Pandas在绘制基础图表(如折线图)和进阶图表(如分组柱状图、热力图)时的常见问题及解决方案,涵盖数据准备、报错处理、图表优化等内容,并通过代码案例详细解释,帮助读者掌握数据可视化的技巧。
112 13
Pandas高级数据处理:数据流式计算
在大数据时代,Pandas作为Python强大的数据分析库,在处理结构化数据方面表现出色。然而,面对海量数据时,如何实现高效的流式计算成为关键。本文探讨了Pandas在流式计算中的常见问题与挑战,如内存限制、性能瓶颈和数据一致性,并提供了详细的解决方案,包括使用`chunksize`分批读取、向量化操作及`dask`库等方法,帮助读者更好地应对大规模数据处理需求。
106 17
Pandas高级数据处理:交互式数据探索
Pandas是Python中流行的数据分析库,提供丰富的数据结构和函数,简化数据操作。本文从基础到高级介绍Pandas的使用,涵盖安装、读取CSV/Excel文件、数据查看与清洗、类型转换、条件筛选、分组聚合及可视化等内容。掌握这些技能,能高效进行交互式数据探索和预处理。
57 6
Pandas高级数据处理:数据加密与解密
本文介绍如何使用Pandas结合加密库(如`cryptography`)实现数据加密与解密,确保敏感信息的安全。涵盖对称和非对称加密算法、常见问题及解决方案,包括密钥管理、性能优化、字符编码和数据完整性验证。通过示例代码展示具体操作,并提供常见报错的解决方法。
97 24
Pandas高级数据处理:数据报告生成
Pandas 是数据分析领域不可或缺的工具,支持多种文件格式的数据读取与写入、数据清洗、筛选与过滤。本文从基础到高级,介绍如何使用 Pandas 进行数据处理,并解决常见问题和报错,如数据类型不一致、时间格式解析错误、内存不足等。最后,通过数据汇总、可视化和报告导出,生成专业的数据报告,帮助你在实际工作中更加高效地处理数据。
116 8
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等