数据清洗,如何处理完全重复或部分重复的数据?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
上一篇文章中,苏南大叔所描述的例子,侧重于字段名重复,而并不是关心对应字段的数据。而本篇文章中,则更加关注于数据本身。即横向的一条数据,用于描述某个个体特征的一条数据。如果两条(甚至多条)数据重复。该如何处理数据呢?
大家好,这里是苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码经验文章。本文测试环境:python@3.12.3
,pandas@2.2.2
,numpy@1.26.4
。
前置阅读
下面的文章是前置阅读内容:
本文侧重的是传统意义上的数据重复,即描述单条数据的目标特征都相同,这就是本文的主要研究标的物。
龙套角色
这里不考虑列名重复的情况,而是仅仅考虑数据表中横向一条数据的情况。
注意:横向的数据中,不包括索引。在excel
文件或者mysql
表里面,索引的值也是一个字段。但是,这并不是本文数据重复的目标判断标准。所以从excel
转化得到的dataframe
,需要特别注意转化的参数。
下面的excel
文件,是本文的龙套。
读取它内容的测试代码如下:
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
经验文章,请参考下面的链接。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。