Pandas 重复数据处理大全
作者 | 东哥起飞
来源 | Python数据科学
本次来介绍重复值处理的常用方法。
重复值处理主要涉及两个部分,一个是找出重复值,第二个是删除重复值,也就是根据自己设定的条件进行删除操作。
定位重复值
对于重复值,我们首先需要查看这些重复值是什么样的形式,然后确定删除的范围,而查询重复值需要用到duplicated
函数。
duplicated
的返回值是布尔值,返回True
和False
,默认情况下会按照一行的所有内容进行查重。
主要参数:
subset
:如果不按照全部内容查重,那么需要指定按照哪些列进行查重。比如按照姓名进行查重subset=['name']
,那么具有相同名字的人就只会保留一个,但很可能只是重名的原因,而并非真正同一个人,所以可以按照姓名和出生日期两列查重,subset=['name','birthday']
,同理还可以再添加列,这样就可以基本保证去重效果了。keep
:用来确定要标记的重复值,可以设置为first
、last
、False
。first
:除第一次出现的重复值,其他都标记为Truelast
:除最后一次出现的重复值,其他都标记为TrueFalse
:所有重复值都标记为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
-------------------
上面按user
和hobby
两个变量进行查重,并设置keep
参数为last
,所以筛选出了除最后一个重复值以外的其它重复值。
通过两个参数的设置就可以查看自己想要的重复值了,以此判断要删除哪个,保留哪个。
删除重复值
当确定好需要删除的重复值后,就进行进行删除的操作了。
删除重复值会用到drop_duplicates
函数。
和duplicated()
函数参数类似,主要有3个参数:
subset
:同duplicated()
,设置去重的字段keep
: 这里稍有不同,duplicated()
中是将除设置值以外重复值都返回True
,而这里是保留的意思。同样可以设置first
、last
、False
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
------------------------
以上就是重复值相关的所有操作。
注意事项
在删除重复值时,要注意下删除的逻辑。
因为很多时候我们需要把这些离线的清洗操作在线上复现。
如果我们随机地删除重复行,没有明确的逻辑,那么对于这种随机性线上是无法复现的,即无法保证清洗后的数据一致性。
所以我们在删除重复行前,可以把重复判断字段进行排序处理。
比如上面例子中,如果要对user
和price
去重,那么比较严谨的做法是按照user
和price
进行排序。
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
--------------------
因为有了排序性,只要按这个逻辑它的顺序是固定的,而不是随机的。所以无论我们设置keep
为first
还是last
,都没有任何影响。
往
期
回
顾
资讯
Meta开发AI语音助手,助力元宇宙
资讯
Python:Bug官网不要了,全迁
技术
用Python制作可视化报表,太快了
资讯
M2芯片终于要来了?全线换新
分享
点收藏
点点赞
点在看
相关文章:

DEDECMS教程:上/下一篇文章标题长度的截取方法
对dedecms了解的朋友们,想必对如何获取上一篇、下一篇文章的标签也是非常熟悉。dedecms获取上一篇、下一篇文章的标签分别为:{dede:prenext getpre/}、{dede:prenext getnext}。 在这个标签里,并没有设置上一篇、下一篇文章标题字数的功能&am…

以太网帧最小字节数以及以太网碰撞
说明:本文源自多个网页,原文链接已经不可寻 以太网是无连接的,不可靠的服务,采用尽力传输的机制。以太网CSMA/CD我就不多讲了,我相信大家都了解这个原理。以太网是不可靠的,这意味着它并不知道对方有没有收…

lodash 提取前N个元素 take
_.take(array, [n1])从数组的起始元素开始提取 N 个元素。 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

JavaScript 中的有限状态机
http://www.ibm.com/developerworks/cn/web/wa-finitemach/JavaScript 中的有限状态机Page navigation系列文章有限状态机很早就已用作设计和实现事件驱动的程序(比如网络适配器和编译器)内复杂行为的组织原则。现在,可编程的 Web 浏览器为新…

健身也内卷?这届网友用 Python 掌握了做标准俯卧撑的秘诀
自己在家锻炼时,我们很难知道自己的动作是否标准。本文作者用Python写了一个可以检测俯卧撑动作是否标准的程序,一起来看看他是怎么做的。 译者 | 章雨铭 出品 | CSDN 在新加坡军队中,有一种测试叫做IPPT(个人身体素质测试&#x…

Linux下配置SNMP
SNMP(Simple NetworkManagement Protocol ):简单网络管理协议本案列为Linux环境搭建(CentOS-6)使用yum进行安装:yum install -y net-snmp安装完成后先查看网络配置:netstat -anupl确认161端口被…

重磅!MaxCompute助力阿里开源自研语音识别模型DFSMN,准确率高达96.04%
阿里开源语音识别模型DFSMN 在近期举行的云栖大会武汉峰会上,装有DFSMN语音识别模型的“AI收银员”在与真人店员的PK中,在嘈杂环境下准确识别了用户的语音点单,在短短49秒内点了34杯咖啡。此外,装备这一语音识别技术的自动售票机也…

全球网络拓扑图
原文出自海外一个论坛:http://board.us.ikariam.com/board16-miscellaneous/board205-discussion-board/67724-internet/InternetSo, I always take a look at these maps and also information on the workings of the internetAnd I have questions:Are there map…

Python 实现 PD 文字识别、提取并写入 CSV 文件脚本分享
作者 | 一只河马h来源 | 简说Python一、前言二、需求描述三、开始动手动脑3.1 安装相关第三方包3.2 导入需要用到的第三方库3.3 读取pdf文件,并识别内容3.4 对识别的数据进行处理,写入csv文件总结前言扫描件一直受大众青睐,任何纸质资料在扫描…

根据listObject中的某个字段排序
compareTo必须是两个对象之间的比较(比如Long,Integer...),以下例子是升序排序 private void businessSort(List<WxDailyBusinessInfo> wxDailyBusinessInfo) { //排序前for (int i 0; i < wxDailyBusinessInfo.size(); i) {System.out.println(new Gson(…

CC国内厂商现状
(1)阿里云的产品 CC攻击 攻击者攻击服务器的认证页面、登录页面、游戏论坛等。还是用饭馆的例子,CC攻击相当于,坏人霸占收银台结账、霸占服务员点菜,导致正常的客人无法享受到服务。 游戏盾如何防御CC攻击?…

网络模型 - 随机网络,无标度网络,分层网络
转自: http://www.flickr.com/photos/caseorganic/4510691991/in/set-72157624621620243小图大图Network Models - Random network, Scale-free network, Hierarchical network随机网络The Erds–Rnyi (ER) model of a random network14 (see figure, part A) start…

一文介绍机器学习中的三种特征选择方法
作者 | luanhz来源 | 小数志导读机器学习中的一个经典理论是:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。也正因如此,特征工程在机器学习流程中占有着重要地位。广义的特征工程一般可分为三个环节:特征提取、…

[转化率预估-1]引言
原文:hhttp://www.flickering.cn/ads/2014/06/%E8%BD%AC%E5%8C%96%E7%8E%87%E9%A2%84%E4%BC%B0%E2%80%94%E2%80%94%E5%BC%95%E8%A8%80/ 最近几年,“计算广告学”的概念风生水起,让我们这些从事在线广告匹配技术的程序猿着实荣耀了一把。这在参…

reportNG定制化之失败截图及日志
先从github上拉下 reportNg的源代码 reportng 拉下源码后我们使用IDEA进行导入 1、reportng.properties 增加部分类表项 这里我们直接在末尾添加 logLog Info screenshotScreen Shot durationDuration2、results.html.vm 修改结果的html,我们目前只修改fail的情况下…

基于 OpenCV 的手掌检测和手指计数
作者 | 努比 来源 | 小白学视觉 利用余弦定理使用OpenCV-Python实现手指计数与手掌检测。 手检测和手指计数 接下来让我们一起探索以下这个功能是如何实现的。 OpenCV OpenCV(开源计算机视觉库)是一个开源计算机视觉和机器学习软件库。OpenCV的构建旨在为…

side menu待研究
2019独角兽企业重金招聘Python工程师标准>>> http://fontawesome.bootstrapcheatsheets.com/ http://www.queness.com/post/14666/recreate-google-nexus-menu http://www.jqueryscript.net/demo/Sliding-Side-Menu-Panel-with-jQuery-Bootstrap-BootSideMenu/ &a…

Gitlab Issue Tracker and Wiki(一)
本节内容:创建第一个问题创建第一个合并请求接受合并请求工作里程碑在提交中引用问题创建维基百科页使用Gollum管理维基百科一. 创建问题1. 登陆Gitlab服务器2. 切换到想要创建问题的项目3. 点击Issues.4. 点击【New issue】5. 根据情况进行填写。二. 创建合并请求1…

runtime实践之Method Swizzling
利用 Objective-C 的 Runtime 特性,我们可以给语言做扩展,帮助解决项目开发中的一些设计和技术问题。这一篇,我们来探索一些利用 Objective-C Runtime 的黑色技巧。这些技巧中最具争议的或许就是 Method Swizzling 。 介绍一个技巧࿰…

网络协议关系拓扑图 很全面 很好
NETWORK ASSOCIATES GUIDE TO COMMUNICATIONS PROTOCOLS 网络协议关系拓扑图 很全面 很好 值得收藏!

一行代码搞定 Python 逐行内存消耗分析
作者 | 费弗里来源 | Python大数据分析我们即将学习的是:一行代码分析Python代码行级别内存消耗。很多情况下,我们需要对已经写好的Python程序的内存消耗进行优化,但是一段代码在运行过程中的内存消耗是动态变化的,这种时候就可以…

崛起于Springboot2.X之Mybatis-全注解方式操作Mysql(4)
为什么80%的码农都做不了架构师?>>> 1、使用注解方式对mysql增删改查,它很方便,不像一些逆向工程工具一样生成的都是乱七八糟,虽然很全的方法,完全手写sql 基于上一篇博客,我们只需要新建一个目录dao层&am…

hdu 1247
Problem DescriptionA hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.You are to find all the hat’s words in a dictionary.InputStandard input consists of a number of lowercase words, one per li…

php执行URL解析
方法一: $url"http://www.baidu.com";file_get_contents($url);方法二: // CURL 方法$url"http://www.baidu.com";$ch curl_init( );curl_setopt( $ch,CURLOPT_URL,$url );curl_setopt( $ch,CURLOPT_HEADER,0 );curl_setopt( $ch,…

Python 来分析,堪比“唐探系列”!B站9.5分好评如潮!
作者 | 菜鸟哥来源 | 菜鸟学PythonHello 小伙伴们,最近一部非常不错的悬疑侦探喜剧 电影,登上B站热榜!菜鸟哥看完之后,大呼过瘾,简直就是一本非常棒的"剧本杀"!演员都是实力派,演技超…

10进制转换为二十六进制字符串A-Z
def convert10to26(num): ...: 10进制转为26进制字母 A-Z, 输入参数10进制数num, 返回26位的字母A-Z 参数type: num: int return: str ...: ...: digit_list [] # 列表当栈使用,存储每次求余的结果 ...: while num !0: ...: digit_list.append(num%26)…

从hello world 说程序运行机制
http://www.cnblogs.com/yanlingyin/archive/2012/03/05/2379199.html 开篇 学习任何一门编程语言,都会从hello world 开始。对于一门从未接触过的语言,在短时间内我们都能用这种语言写出它的hello world。然而,对于hello world 这个简单程序…

爱耳日腾讯天籁行动再升级 助力100位青年听障人才打破“屏障”
公益是解决社会问题的重要切入口,科技是提升效率的强有力工具。当产业技术走入公益场景,科技也在发挥更大的社会价值。 《中国听力健康报告(2021)》显示,过度的噪音曝露,正让全球11亿年轻人面临听力受损的风…

IOS推送详解
为什么80%的码农都做不了架构师?>>> IOS推送详解 一.关于推送通知 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务…

redis(4)
redis-cli -p 6380redis-cli -p 6379 info server | grep run_idpsync ? -1