如何在Pandas中找到并筛选重复行?
在数据清洗和处理过程中,经常遇到需要找到并去除重复行的情况。在Pandas中,可以使用duplicated()
函数来找到重复的行,然后使用drop_duplicates()
函数来去除这些行。在本文中,我们将介绍如何在Pandas中找到并筛选重复行。
更多Pandas相关文章,请阅读:Pandas 教程
使用duplicated()函数找到重复行
duplicated()
函数可以找到DataFrame或Series中的重复行。默认情况下,只有所有列值都相等的行才会被视为重复行。例如,假设我们有以下的DataFrame:
import pandas as pd
data = {'name': ['Alice', 'Bob', 'Charlie', 'Alice'],
'age': [25, 30, 35, 25],
'gender': ['F', 'M', 'M', 'F']}
df = pd.DataFrame(data)
print(df)
输出结果为:
name age gender
0 Alice 25 F
1 Bob 30 M
2 Charlie 35 M
3 Alice 25 F
可以看到,第一个和第四个行是重复的,因为两行所有列的值都相等。我们可以使用duplicated()
函数来找到这些行:
duplicates = df[df.duplicated()]
print(duplicates)
输出结果为:
name age gender
3 Alice 25 F
duplicated()
函数返回一个布尔型的Series,表示每一行是否为重复行。把这个结果传递给DataFrame的索引器,就可以得到所有的重复行了。
需要注意的是,duplicated()
函数默认对所有列进行比较。如果我们只想要根据某一列判断重复行,可以在函数调用时指定subset
参数。例如,如果我们只想要根据name
列来判断重复行,可以这样写:
duplicates = df[df.duplicated(subset=['name'])]
print(duplicates)
输出结果为:
name age gender
3 Alice 25 F
使用drop_duplicates()函数去除重复行
drop_duplicates()
函数可以去除DataFrame或Series中的重复行。默认情况下,只有所有列值都相等的行才会被视为重复行。例如,如果我们要去除df
中的重复行,可以这样写:
df = df.drop_duplicates()
print(df)
输出结果为:
name age gender
0 Alice 25 F
1 Bob 30 M
2 Charlie 35 M
可以看到,第一个和第四个行已经被去除了。
需要注意的是,drop_duplicates()
函数默认对所有列进行比较。如果我们只想要根据某一列去除重复行,可以在函数调用时指定subset
参数。例如,如果我们只想要根据name
列去除重复行,可以这样写:
df = df.drop_duplicates(subset=['name'])
print(df)
输出结果为:
name age gender
0 Alice 25 F
1 Bob 30 M
2 Charlie 35 M
保留第一个或最后一个重复行
有时候我们需要保留第一个或最后一个重复行,可以使用keep
参数来指定。如果keep
参数为first
,则保留第一个重复行;如果keep
参数为last
,则保留最后一个重复行。例如,假设我们有以下的DataFrame:
data = {'name': ['Alice', 'Bob', 'Charlie', 'Alice'],
'age': [25, 30, 35, 40],
'gender': ['F', 'M', 'M', 'F']}
df = pd.DataFrame(data)
print(df)
输出结果为:
name age gender
0 Alice 25 F
1 Bob 30 M
2 Charlie 35 M
3 Alice 40 F
如果我们只想要保留第一个重复行,可以这样写:
df = df.drop_duplicates(keep='first')
print(df)
输出结果为:
name age gender
0 Alice 25 F
1 Bob 30 M
2 Charlie 35 M
3 Alice 40 F
可以看到,第一个重复行被保留了。
如果我们只想要保留最后一个重复行,可以这样写:
df = df.drop_duplicates(keep='last')
print(df)
输出结果为:
name age gender
1 Bob 30 M
2 Charlie 35 M
3 Alice 40 F
可以看到,第四个行被保留了。
针对特定列进行去重
上面的例子都是针对整个DataFrame进行去重操作。如果我们只想针对特定列进行去重,可以使用subset
参数。例如,假设我们有以下的DataFrame:
data = {'name': ['Alice', 'Bob', 'Charlie', 'Alice'],
'age': [25, 30, 35, 40],
'gender': ['F', 'M', 'M', 'F']}
df = pd.DataFrame(data)
print(df)
输出结果为:
name age gender
0 Alice 25 F
1 Bob 30 M
2 Charlie 35 M
3 Alice 40 F
如果我们只想要根据name
列去重,可以这样写:
df = df.drop_duplicates(subset=['name'])
print(df)
输出结果为:
name age gender
0 Alice 25 F
1 Bob 30 M
2 Charlie 35 M
可以看到,只有name
列被用来判断重复行。
忽略NaN值
默认情况下,duplicated()
和drop_duplicates()
函数会将所有的NaN值都视为不同的值。例如,假设我们有以下的DataFrame:
data = {'name': ['Alice', 'Bob', 'Charlie', 'Alice'],
'age': [25, 30, 35, None],
'gender': ['F', 'M', 'M', 'F']}
df = pd.DataFrame(data)
print(df)
输出结果为:
name age gender
0 Alice 25.0 F
1 Bob 30.0 M
2 Charlie 35.0 M
3 Alice NaN F
可以看到,第四个行包含NaN值。如果我们使用duplicated()
函数查找重复行,会得到以下的结果:
duplicates = df[df.duplicated()]
print(duplicates)
输出结果为:
name age gender
3 Alice NaN F
可以看到,第四个行被视为重复行了。
如果我们希望忽略NaN值,可以使用drop_duplicates()
函数的keep
参数来指定保留哪个NaN值。如果keep
参数为first
,则保留第一个出现的NaN值;如果keep
参数为last
,则保留最后一个出现的NaN值。例如,如果我们希望保留第一个出现的NaN值,可以这样写:
df = df.drop_duplicates(keep='first')
print(df)
输出结果为:
name age gender
0 Alice 25.0 F
1 Bob 30.0 M
2 Charlie 35.0 M
3 Alice NaN F
可以看到,第四个行被保留了。
结论
在本文中,我们介绍了如何在Pandas中找到并去除重复行。我们学习了duplicated()
函数和drop_duplicates()
函数的用法,并且掌握了如何针对特定列进行去重,以及如何忽略NaN值。在实际的数据处理过程中,去除重复行是一个非常常见的操作,掌握了Pandas中去重的技巧,可以使数据清洗和处理的效率得到很大提升。