重复值的处理
当数据中出现了重复值,在大多数情况下需要进行删除。例如,person_info表中id值为4的数据连续出现了两次,并且两行的数据完全一样,如图1所示。
图1 person_info表
Pandas提供了两个函数专门用来处理数据中的重复值,分别为duplicated()和drop_duplicates()方法。其中,前者用于标记是否有重复值,后者用于删除重复值,它们的判断标准是一样的,即只要两条数据中所有条目的值完全相等,就判断为重复值。接下来,为大家详细介绍这两个方法的基本使用,具体内容如下。
1. 通过duplicated()方法处理重复值
duplicated()方法的语法格式如下:
duplicated(subset=None, keep='first')
上述方法中参数的含义如下:
(1) subset:用于识别重复的列标签或列标签序列,默认识别所有的列标签。
(2) keep:删除重复项并保留第一次出现的项,取值可以为first、last或False,它们代表的含义如下:
first:从前向后查找,除了第一次出现外,其余相同的被标记为重复。默认为此选项。
last:从后向前查找,除了最后一次出现外,其余相同的被标记为重复。
False:所有相同的都被标记为重复。
duplicated()方法用于标记Pandas对象的数据是否重复,重复则标记为True,不重复则标记为False,所以该方法返回一个由布尔值组成的Series对象,它的行索引保持不变,数据则变为标记的布尔值。
注意:
对于duplicated()方法,这里有如下两点要进行强调:
第一,只有数据表中两个条目间所有列的内容都相等时,duplicated()方法才会判断为重复值。除此之外,duplicated()方法也可以单独对某一列进行重复值判断。
第二,duplicated()方法支持从前向后(first)和从后向前(last)两种重复值查找模式,默认是从前向后查找判断重复值的。换句话说,就是将后出现的相同条目判断为重复值。
为了更好地理解duplicated()方法的使用,接下来,通过一个示例来演示如何从前向后查找并判断person_info表中的重复值,具体代码如下:
In [11]: import pandas as pd
person_info = pd.DataFrame({'id': [1, 2, 3, 4, 4, 5],
'name': ['小铭', '小月月', '彭岩', '刘华', '刘华', '周华'],
'age': [18, 18, 29, 58, 58, 36],
'height': [180, 180, 185, 175, 175, 178],
'gender': ['女', '女', '男', '男', '男', '男']})
person_info.duplicated() # 从前向后查找和判断是否有重复值
Out[11]:
0 False
1 False
2 False
3 False
4 True
5 False
dtype: bool
在上述示例中,首先创建了一个结构与person_info表一样的DataFrame对象,然后调用duplicated()方法对表中的数据进行重复值判断,使用默认的从前向后的查找方式,也就是说第二次出现的数据为重复值。
从输出结果看出,索引4对应的判断结果为True,表明这一行是重复的。
2. 通过drop_duplicates()方法处理重复值
drop_duplicates()方法的语法格式如下:
drop_duplicates(subset=None, keep='first', inplace=False)
上述方法中,inplace参数接收一个布尔类型的值,表示是否替换原来的数据,默认为False。
接下来,使用drop_duplicates()方法将person_info表中的重复数据进行删除,示例代码如下。
In [12]: import pandas as pd
person_info = pd.DataFrame({'id': [1, 2, 3, 4, 4, 5],
'name': ['小铭', '小月月', '彭岩', '刘华', '刘华', '周华'],
'age': [18, 18, 29, 58, 58, 36],
'height': [180, 180, 185, 175, 175, 178],
'gender': ['女', '女', '男', '男', '男', '男']})
person_info. drop_duplicates()
Out[12]:
id name age height gender
0 1 小铭 18 180 女
1 2 小月月 18 180 女
2 3 彭岩 29 185 男
3 4 刘华 58 175 男
5 5 周华 36 178 男
上述代码中,同样创建了一个结构与person_info表一样的DataFrame对象,之后调用drop_duplicates()方法执行删除重复值操作。从输出结果看出,name列中值为“刘华”的数据只出现了一次,重复的数据已经被删除了。
注意:
删除重复值是为了保证数据的正确性和可用性,为后期对数据的分析提供了高质量的数据。