我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

上一篇文章中,苏南大叔所描述的例子,侧重于字段名重复,而并不是关心对应字段的数据。而本篇文章中,则更加关注于数据本身。即横向的一条数据,用于描述某个个体特征的一条数据。如果两条(甚至多条)数据重复。该如何处理数据呢?

苏南大叔:数据清洗,如何处理完全重复或部分重复的数据? - 处理重复数据
数据清洗,如何处理完全重复或部分重复的数据?(图2-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码经验文章。本文测试环境:python@3.12.3pandas@2.2.2numpy@1.26.4

前置阅读

下面的文章是前置阅读内容:

本文侧重的是传统意义上的数据重复,即描述单条数据的目标特征都相同,这就是本文的主要研究标的物。

龙套角色

这里不考虑列名重复的情况,而是仅仅考虑数据表中横向一条数据的情况。

注意:横向的数据中,不包括索引。在excel文件或者mysql表里面,索引的值也是一个字段。但是,这并不是本文数据重复的目标判断标准。所以从excel转化得到的dataframe,需要特别注意转化的参数。

下面的excel文件,是本文的龙套。

苏南大叔:数据清洗,如何处理完全重复或部分重复的数据? - 测试数据集
数据清洗,如何处理完全重复或部分重复的数据?(图2-2)

读取它内容的测试代码如下:

import pandas as pd
df = pd.read_excel("test.xls", index_col="id", na_values=['NA','None'])
print(df)
print(df.columns)
print(df.index)

读取的结果如下:

     name   age  category
id
1   老许      2        猫
2   二赖子    3        狗
3   黑猫      4        猫
4   二赖子    5        狗
5   黑猫      2        猫
6   二赖子    3        狗
Index(['name', 'age', 'category'], dtype='object')
Index([1, 2, 3, 4, 5, 6], dtype='int64', name='id')

nunique(),唯一值统计

注意写法,方法名称是:n+unique()

print(df.nunique())
print(type(df.nunique()))

输出:

name        3
age         4
category    2
dtype: int64
<class 'pandas.core.series.Series'>

可见,这个.nunique()方法的主要作用就是获得每个字段里面的唯一值的总数。

duplicated(),重复性检测

这里默认就是全部字段进行匹配的,也就是说完全重复的。所以,只有数据6的返回值是True

print(df.duplicated())

输出:

id
1    False
2    False
3    False
4    False
5    False
6     True
dtype: bool

重复的标准,subset

再次重申,重复的标准:

  • 不包括索引键【例如id】。
  • 某几个字段重复,如果场景允许,可以算重复。
  • 全部字段重复,当然算数据重复。

对比这个文件,可以看到:

  • 数据2和数据6是完全重复的。
  • 数据3和数据5是部分重复的。
  • 数据4和数据2/6是部分重复的。
print(df.duplicated(subset=['name', 'category']))

输出:

id
1    False
2    False
3    False
4     True
5     True
6     True
dtype: bool

数据流的方向,keep

也可以使用keep='last',使得数据流的方向进行逆转,从后往前匹配。所以,数据2变成了True

print(df.duplicated(keep='last'))

输出:

id
1    False
2     True
3    False
4    False
5    False
6    False
dtype: bool

drop_duplicates()

如果理解了.duplicated(),这个.drop_duplicates()就非常好理解了。就是把重复的值(为True)的数据删除掉。

print(df.drop_duplicates())

输出:

   name    age  category
id
1   老许     2        猫
2   二赖子   3        狗
3   黑猫     4        猫
4   二赖子   5        狗
5   黑猫     2        猫
print(df.drop_duplicates(subset=['name', 'category']))

输出:

   name   age  category
id
1   老许    2        猫
2   二赖子  3        狗
3   黑猫    4        猫
print(df.drop_duplicates(subset=['name', 'category'], keep='last'))

输出:

   name    age  category
id
1   老许     2        猫
5   黑猫     2        猫
6   二赖子   3        狗

结束语

对重复数据进行适当清理之后,需要做的就是数据修复了。更多苏南大叔的python经验文章,请参考下面的链接。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python