Pandas 重复数据处理大全

f870fd2d0c17f728d5a17a7ed095e477.gif

作者 | 东哥起飞

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

933e06182595c90288c0e6d0600013e5.gif

资讯

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

资讯

Python:Bug官网不要了,全迁

技术

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

资讯

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

3ac83bf63298888b415d7db8f3f9b817.png

分享

59dcd4cd40e77014e64610bd610ad1ef.png

点收藏

eedacff74198d1e212abe316d97e2d89.png

点点赞

48bb2b60b40350ac8118cbbf5b8e260f.png

点在看

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值