作者 | 东哥起飞

来源 | Python数据科学

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


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

定位重复值

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

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

主要参数:

  • subset:如果不按照全部内容查重,那么需要指定按照哪些列进行查重。比如按照姓名进行查重subset=['name'],那么具有相同名字的人就只会保留一个,但很可能只是重名的原因,而并非真正同一个人,所以可以按照姓名和出生日期两列查重,subset=['name','birthday'],同理还可以再添加列,这样就可以基本保证去重效果了。

  • keep:用来确定要标记的重复值,可以设置为firstlastFalse

    • first:除第一次出现的重复值,其他都标记为True

    • last:除最后一次出现的重复值,其他都标记为True

    • False:所有重复值都标记为True

实例:

import pandas as pd
import numpy as npdata = {'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,都没有任何影响。

资讯

Meta开发AI语音助手,助力元宇宙

资讯

Python:Bug官网不要了,全迁

技术

用Python制作可视化报表,太快了

资讯

M2芯片终于要来了?全线换新

分享

点收藏

点点赞

点在看

Pandas 重复数据处理大全相关推荐

  1. 【Python】pandas 重复数据处理大全(附代码)

    所有数据和代码可在GitHub获取: https://github.com/xiaoyusmd/PythonDataScience 本次来介绍重复值处理的常用方法. 重复值处理主要涉及两个部分,一个是 ...

  2. 【Python】pandas 分类数据处理大全(附代码)

    所有数据和代码可在GitHub获取: https://github.com/xiaoyusmd/PythonDataScience category是pandas的一种分类的定类数据类型.和文本数据. ...

  3. 【Python】pandas 缺失数据处理大全(附代码)

    之前一直在分享pandas的一些骚操作:pandas骚操作,根据大家反映还不错,但是很多技巧都混在了一起,没有细致的分类,这样不利于查找,也不成体系. 利用闲暇之余将有关数据清洗.数据分析的一些技能再 ...

  4. pandas 分类数据处理大全

    作者 | 东哥起飞 来源 | Python数据科学 继续更新pandas数据清洗~ category是pandas的一种分类的定类数据类型.和文本数据.str.<methond>一样,它也 ...

  5. Python 数据分析三剑客之 Pandas(八):数据重塑、重复数据处理与数据替换

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  6. pandas基础操作大全之数据合并

    在pandas 基础操作大全之数据读取&清洗&分析中介绍了pandas常见的数据处理操作,现在继续对pandas常用的数据合并操作做下介绍,便于大家快速了解,也方便后续需要时快速查询. ...

  7. 数据分析——使用pandas进行数据处理

    使用pandas进行数据处理 概念介绍 pandas模块介绍 Series和DataFrame Series简介 DataFrame简介 DataFrame的常用属性方法 创建DataFrame Da ...

  8. 数据库,唯一索引,重复数据处理

    为什么80%的码农都做不了架构师?>>>    //唯一索引,重复数据处理 1.为母表建立唯一主键(主键为自增,此字段在后面删除记录时会用到),同时 建立和母表一样的临时表(此表要建 ...

  9. python 取反_自从用了这招pandas 空数据处理方法,python编程速度提升了不少

    今天为大家带来的内容是:自从用了这招pandas 空数据处理方法,python编程速度提升了不少 文章内容主要介绍了pandas 空数据处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工 ...

最新文章

  1. 把度分秒的经纬度转换成十进制的经纬度的工具类
  2. 指数型组织形成的 9 大驱动因素
  3. java基础(一)-面向对象思想
  4. tecplot对数坐标轴怎么画_一次更换双速风机接线经历,想通了改变磁极对数原理...
  5. mongo java aggregate_java使用spring + mongo进行Aggregation聚合查询
  6. 20200327:最大矩形(leetcode85)
  7. JMP M16:64
  8. 日程表、学生课表插件
  9. jrtplib 打包做了哪些事_使用jrtplib打包发送h264数据,关使用vlc|mplayer播放 | 学步园...
  10. [Everyday Mathematic]20150217
  11. javamail 超时_为什么JavaMail连接超时过长
  12. 马云在大学学计算机,大佬高考往事 马云数学考一分刘强东错选专业
  13. HashMap源码解析JDK1.8 —————— 开开开山怪
  14. win10添加打印机失败,无法正常使用打印机的解决办法
  15. 微信小程序之点击图片滑动到相应内容
  16. 基于Linux用C语言实现TCP半双工通信和UDP半双工通信
  17. 查询数据库空间(mysql和oracle)
  18. Adnroid ViewPage 使用
  19. 航班信息查询和检索系统
  20. 批量替换文本中的多组字符串

热门文章

  1. html树状结构怎么展开,纯css实现树形结构
  2. c语言写输入汉字输出区位码程序,2017年计算机应用基础检测试题
  3. Vue 中 CSS 动画原理
  4. windows 系统常用操作
  5. Android Studio快捷键每日一练(2)
  6. Mysql INSERT、REPLACE、UPDATE的区别
  7. no no no.不要使用kill -9.
  8. Android监听HOME按键
  9. 认识HTML5的WebSocket 认识HTML5的WebSocket
  10. Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo