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,都没有任何影响。


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

相关文章
|
2月前
|
数据可视化 数据挖掘 数据处理
进阶 pandas DataFrame:挖掘高级数据处理技巧
【5月更文挑战第19天】本文介绍了Pandas DataFrame的高级使用技巧,包括数据重塑(如`pivot`和`melt`)、字符串处理(如提取和替换)、日期时间处理(如解析和时间序列操作)、合并与连接(如`merge`和`concat`),以及使用`apply()`应用自定义函数。这些技巧能提升数据处理效率,适用于复杂数据分析任务。推荐进一步学习和探索Pandas的高级功能。
|
2月前
|
数据处理 索引 Python
使用pandas的merge()和join()函数进行数据处理
使用pandas的merge()和join()函数进行数据处理
55 2
|
2月前
|
数据采集 数据挖掘 大数据
数据处理利器:使用Pandas进行数据清洗与转换
【4月更文挑战第12天】在大数据时代,Pandas是Python数据分析的关键工具,提供高效的数据清洗和转换功能。本文介绍了如何使用Pandas处理缺失值(删除或填充)、异常值(Z-Score法和IQR法)以及重复值(检测和删除)。此外,还涵盖了数据转换,包括数据类型转换、数据标准化(Min-Max和Z-Score)以及类别数据的one-hot编码。通过学习这些方法,可以为数据分析和挖掘奠定坚实基础。
|
2天前
|
机器学习/深度学习 数据采集 大数据
驾驭大数据洪流:Pandas与NumPy在高效数据处理与机器学习中的核心作用
【7月更文挑战第13天】在大数据时代,Pandas与NumPy是Python数据分析的核心,用于处理复杂数据集。在一个电商销售数据案例中,首先使用Pandas的`read_csv`加载CSV数据,通过`head`和`describe`进行初步探索。接着,数据清洗涉及填充缺失值和删除异常数据。然后,利用`groupby`和`aggregate`分析销售趋势,并用Matplotlib可视化结果。在机器学习预处理阶段,借助NumPy进行数组操作,如特征缩放。Pandas的数据操作便捷性与NumPy的数值计算效率,共同助力高效的数据分析和建模。
|
1天前
|
机器学习/深度学习 数据采集 数据处理
重构数据处理流程:Pandas与NumPy高级特性在机器学习前的优化
【7月更文挑战第14天】在数据科学中,Pandas和NumPy是数据处理的关键,用于清洗、转换和计算。用`pip install pandas numpy`安装后,Pandas的`read_csv`读取数据,`fillna`处理缺失值,`drop`删除列。Pandas的`apply`、`groupby`和`merge`执行复杂转换。NumPy加速数值计算,如`square`进行向量化操作,`dot`做矩阵乘法。结合两者优化数据预处理,提升模型训练效率和效果。
|
1天前
|
数据采集 机器学习/深度学习 数据处理
从基础到卓越:Pandas与NumPy在复杂数据处理中的实战策略
【7月更文挑战第14天】Pandas与NumPy在数据科学中的核心应用:**加载数据(如`read_csv`)、探索(`head()`, `info()`, `describe()`)、数据清洗(`fillna`, `dropna`, `replace`, `apply`)、数值计算(借助NumPy的`ndarray`)、分组聚合(`groupby`与聚合函数)、窗口函数(如`rolling`)和数据筛选排序(布尔索引,`query`,`sort_values`)。通过这些工具,实现从数据预处理到复杂分析的高效处理。
6 0
|
2月前
|
数据挖掘 数据处理 Python
【Python DataFrame 专栏】深入探索 pandas DataFrame:高级数据处理技巧
【5月更文挑战第19天】在 Python 数据分析中,pandas DataFrame 是核心工具。本文介绍了几个高级技巧:1) 横向合并 DataFrame;2) 数据分组与聚合;3) 处理缺失值;4) 数据重塑;5) 条件筛选;6) 使用函数处理数据。掌握这些技巧能提升数据处理效率和分析深度,助你更好地发掘数据价值。
【Python DataFrame 专栏】深入探索 pandas DataFrame:高级数据处理技巧
|
1月前
|
存储 数据挖掘 数据处理
19. Python 数据处理之 Pandas
19. Python 数据处理之 Pandas
35 1
|
1月前
|
数据采集 安全 数据处理
Python采集数据处理:利用Pandas进行组排序和筛选
使用Python的Pandas库,结合亿牛云代理和多线程技术,提升网络爬虫数据处理效率。通过代理IP避免封锁,多线程并发采集,示例代码展示数据分组、排序、筛选及代理IP配置和线程管理。
Python采集数据处理:利用Pandas进行组排序和筛选
|
2月前
|
数据采集 数据可视化 数据处理
Python中的高效数据处理:Pandas库详解
Python中的高效数据处理:Pandas库详解
53 2