duplicated()
在 Pandas 中,duplicated()
是一个非常实用的方法,用于标识重复的行。它返回一个布尔值的 Series
,标识哪些行是重复的,默认情况下标识除了第一次出现的所有重复行。
duplicated()
方法的基本用法:
DataFrame.duplicated(subset=None, keep='first')
参数说明:
-
subset:用于判断重复的列。如果没有指定,默认会检查所有列。
-
keep
:控制哪一条记录被标记为重复:
'first'
(默认):标记除了第一次出现的记录外,其他重复的行。'last'
:标记除了最后一次出现的记录外,其他重复的行。False
:标记所有重复的行(包括第一次和最后一次)。
返回值:
duplicated()
返回一个布尔类型的 Series
,标记哪些行是重复的。True
表示该行是重复的,False
表示该行是第一次出现。
例子:
假设有一个包含重复数据的 DataFrame
:
import pandas as pd
# 示例数据
data = {
'id': [1, 2, 2, 3, 4, 4, 5],
'name': ['Alice', 'Bob', 'Bob', 'Charlie', 'David', 'David', 'Eve'],
'age': [25, 30, 30, 35, 40, 40, 45]
}
df = pd.DataFrame(data)
print(df)
输出:
id name age
0 1 Alice 25
1 2 Bob 30
2 2 Bob 30
3 3 Charlie 35
4 4 David 40
5 4 David 40
6 5 Eve 45
示例 1:标记重复的行(默认 keep='first'
)
# 使用 duplicated() 查找重复的行
duplicates = df.duplicated()
print(duplicates)
输出:
0 False
1 False
2 True
3 False
4 False
5 True
6 False
dtype: bool
- 解释:
duplicated()
会标记除第一次出现的记录之外的所有重复记录。返回的布尔值Series
表示哪些行是重复的,True
表示是重复的行,False
表示是第一次出现的行。 - 例如,
id=2
和id=4
的行是重复的,所以下标为 2 和 5 的行会被标记为True
。
示例 2:标记最后一次出现的重复记录(keep='last'
)
# 使用 duplicated() 查找重复的行,但保留最后一次出现的记录
duplicates_last = df.duplicated(keep='last')
print(duplicates_last)
输出:
0 False
1 False
2 True
3 False
4 False
5 True
6 False
dtype: bool
- 解释:
keep='last'
时,duplicated()
会标记除了最后一次出现的记录外,其他重复记录为True
。所以,id=2
和id=4
的第二次出现会被标记为True
,而第一次出现会标记为False
。
示例 3:标记所有重复记录(keep=False
)
# 使用 duplicated() 查找所有的重复行,包括第一次和最后一次
duplicates_all = df.duplicated(keep=False)
print(duplicates_all)
输出:
0 False
1 True
2 True
3 False
4 True
5 True
6 False
dtype: bool
- 解释:
keep=False
时,duplicated()
会标记所有的重复记录为True
,包括第一次出现的记录。
示例 4:根据特定列判断重复项
# 使用 'id' 列来判断重复
duplicates_subset = df.duplicated(subset=['id'])
print(duplicates_subset)
输出:
0 False
1 False
2 True
3 False
4 False
5 True
6 False
dtype: bool
- 解释:
subset=['id']
表示只根据id
列来判断重复项。id=2
和id=4
会被标记为重复,第二次出现时标记为True
,第一次出现时标记为False
。
示例 5:删除重复行(基于 duplicated()
)
你可以使用 duplicated()
来标记重复项,然后结合 DataFrame
的布尔索引删除重复项。例如,要删除所有重复的行,保留第一次出现的记录:
df_no_duplicates = df[~df.duplicated()]
print(df_no_duplicates)
输出:
id name age
0 1 Alice 25
1 2 Bob 30
3 3 Charlie 35
4 4 David 40
6 5 Eve 45
- 解释:
~df.duplicated()
返回的是duplicated()
布尔Series
的反向值,~True
是False
,~False
是True
,因此通过df[~df.duplicated()]
可以保留第一次出现的记录,删除后续的重复行。
示例 6:修改原始 DataFrame
(使用 inplace=True
)
df.drop_duplicates(inplace=True)
print(df)
- 解释:
drop_duplicates()
会修改原始的DataFrame
,删除重复行。
总结:
-
duplicated()
方法用于标记重复行,返回一个布尔值Series
,表示哪些行是重复的。 -
keep
参数可以控制保留哪一条记录:
'first'
(默认):标记除了第一次出现的记录外,其他重复行。'last'
:标记除了最后一次出现的记录外,其他重复行。False
:标记所有重复的行,包括第一次和最后一次出现的行。
-
subset
参数允许你只根据特定的列来判断重复项。 -
结合
duplicated()
和布尔索引,可以删除重复的行。
drop_duplicates()
在 Pandas 中,drop_duplicates()
是一个非常实用的函数,用于去除重复的行(或列)。它允许你根据特定的列或整个数据框来删除重复项。
drop_duplicates()
方法的基本用法:
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
参数说明:
-
subset:指定哪些列用于判断重复。如果没有指定,默认情况下会根据所有列判断重复。
-
keep
:决定保留哪一条重复记录:
'first'
(默认):保留首次出现的记录,删除后续的重复项。'last'
:保留最后一条记录,删除之前的重复项。False
:删除所有重复项。
-
inplace:是否在原始数据上进行修改。如果为
True
,则会直接修改原始DataFrame
,并返回None
;如果为False
(默认),则返回一个新的DataFrame
。 -
ignore_index:是否重新索引。默认为
False
,如果为True
,则会重新排列索引。
例子:
假设有一个包含重复数据的 DataFrame
:
import pandas as pd
# 示例数据
data = {
'id': [1, 2, 2, 3, 4, 4, 5],
'name': ['Alice', 'Bob', 'Bob', 'Charlie', 'David', 'David', 'Eve'],
'age': [25, 30, 30, 35, 40, 40, 45]
}
df = pd.DataFrame(data)
print(df)
输出:
id name age
0 1 Alice 25
1 2 Bob 30
2 2 Bob 30
3 3 Charlie 35
4 4 David 40
5 4 David 40
6 5 Eve 45
示例 1:去除所有重复的行(基于所有列)
df_no_duplicates = df.drop_duplicates()
print(df_no_duplicates)
输出:
id name age
0 1 Alice 25
1 2 Bob 30
3 3 Charlie 35
4 4 David 40
6 5 Eve 45
- 解释:默认情况下,
drop_duplicates()
会检查所有列的重复项,并删除后面的重复行,只保留第一条出现的记录。
示例 2:根据某一列去重(例如:根据 id
列)
df_no_duplicates = df.drop_duplicates(subset=['id'])
print(df_no_duplicates)
输出:
id name age
0 1 Alice 25
1 2 Bob 30
3 3 Charlie 35
4 4 David 40
6 5 Eve 45
- 解释:
subset=['id']
表示根据id
列来检查重复项。重复的id=2
和id=4
被删除,只保留每个id
的第一次出现。
示例 3:保留最后一次出现的重复记录
df_no_duplicates = df.drop_duplicates(subset=['id'], keep='last')
print(df_no_duplicates)
输出:
id name age
0 1 Alice 25
2 2 Bob 30
3 3 Charlie 35
5 4 David 40
6 5 Eve 45
- 解释:通过
keep='last'
,我们选择保留重复项中最后一次出现的记录。
示例 4:删除所有重复的行(不保留任何重复项)
df_no_duplicates = df.drop_duplicates(subset=['id'], keep=False)
print(df_no_duplicates)
输出:
id name age
0 1 Alice 25
3 3 Charlie 35
6 5 Eve 45
- 解释:
keep=False
表示删除所有重复的记录,包括第一次出现的记录。因此,只有没有重复的行被保留下来。
示例 5:修改原始 DataFrame
(使用 inplace=True
)
df.drop_duplicates(subset=['id'], keep='first', inplace=True)
print(df)
输出:
id name age
0 1 Alice 25
1 2 Bob 30
3 3 Charlie 35
4 4 David 40
6 5 Eve 45
- 解释:使用
inplace=True
后,drop_duplicates()
会直接在原始df
上进行修改,而不是返回一个新的DataFrame
。
示例 6:重新索引
df_no_duplicates = df.drop_duplicates(subset=['id'], keep='first', ignore_index=True)
print(df_no_duplicates)
输出:
id name age
0 1 Alice 25
1 2 Bob 30
2 3 Charlie 35
3 4 David 40
4 5 Eve 45
- 解释:使用
ignore_index=True
后,删除重复行后会重新排列索引,从0
开始。
总结:
drop_duplicates()
是一个非常实用的方法,可以帮助你快速清理重复的数据。subset
参数允许你根据指定的列来判断是否为重复数据。keep
参数控制保留哪一条记录:'first'
(默认)、'last'
或False
(删除所有重复项)。- 使用
inplace=True
可以直接修改原始DataFrame
,而不是返回一个新的DataFrame
。