【目录】
1. df.duplicated()语法
2. 创建一个df对象
3. subset=None 检查所有列的重复项
4. Keep参数
5. 课堂练习
6. df[df.duplicated()]-查看重复行信息
【正文】
学习时间:30分钟。
1. df.duplicated()语法
duplicated [ˈdjuːplɪkeɪtɪd]:复制,重复的。
【作用】
df.duplicated()
是Pandas库Series和DataFrame对象的一个方法。
df.duplicated()
用于查找和标记DataFrame对象中的重复项。
【语法】
df.duplicated(subset=None, keep='first')
df
表示一个具体的DataFrame对象。
.
英文小圆点。
duplicated
是方法名,作用是查找和标记DataFrame对象中的重复项。
【参数】
subset[ˈsʌbset]:子集。
keep[kiːp]:占有,保留。
subset(可选)
:指定列名或列名列表,用于检查是否存在重复项。默认值为None,表示检查所有列。
keep(可选)
:指定保留重复项的方式。可选值为'first'、'last'或False。默认值为'first',保留首次出现的重复项。
【keep参数】
keep='first'
保留第一次出现的重复行,其他重复行将被标记为True。
keep='last'
保留最后一次出现的重复行,其他重复行将被标记为True。
keep=False
所有重复行都被标记为True,即不保留任何重复行。
【返回值】
返回的结果是一个布尔类型的Series对象。
Series的值为True表示对应行是重复行。
Series的值为False表示不是重复行。
2. 创建一个df对象
【代码示例】
# 导入pandas库并简写为pd
import pandas as pd
# 要传入的数据类型为字典
# 字典的3个键姓名、年龄、成绩是DataFrame对象的列索引
# 字典的值是DataFrame对象的数据
data = {
'姓名': ['李四', '王五', '王五'],
'年龄': [ 19, 20, 20, ],
'成绩': [ 92, 100, 100]
}
# 实例化类创建对象:对象名 = 类名()
# df是对象名,DataFrame是类名
df = pd.DataFrame(data)
# 输出DataFrame对象
print(df)
【终端输出】
姓名 年龄 成绩
0 李四 19 92
1 王五 20 100
2 王五 20 100
观察输出结果,我们发现:
索引为1行的数据和索引为2行的数据完全重复。
3. subset=None 检查所有列的重复项
【使用duplicated()方法检测重复值】
# 使用duplicated()方法检测重复值
# df表示一个具体的DataFrame对象
# duplicated方法名
# 括号为空表示则表示使用默认参数
# 默认subset=None检查所有列的重复项
# 默认keep = first,保留第一次出现的重复行
# duplicates是变量名
duplicates = df.duplicated( )
print(duplicates)
# type查看返回值的数据类型
print(type(duplicates))
【终端输出】
0 False
1 False
2 True
dtype: bool
<class 'pandas.core.series.Series'>
输出结果是一个布尔类型的Series对象。
Series的值为False表示不是重复行。
Series的值为True表示对应行是重复行。
2 True
表示索引2对应的行是重复行。
df对象输出 keep='first'输出
姓名 年龄 成绩
0 李四 19 92 0 False
1 王五 20 100 1 False
2 王五 20 100 2 True
索引1和索引2对应的行是重复的。
1 False
索引1对应的结果为什么是False
呢。
因为keep = first,保留第一次出现的重复行
。
索引1对应的行和索引2对应的行重复,但要保留第一次出现的重复行,因此索引1对应的结果为False
。
保留就是这个意思。
4. Keep参数
keep参数有3种情况,我们先看不同的参数输出结果。
【keep=False】
df.duplicated(keep=False)
【终端输出】
0 False
1 True
2 True
dtype: bool
【keep='first'】
df.duplicated(keep='first')
【终端输出】
0 False
1 False
2 True
dtype: bool
【keep='last'】
df.duplicated(keep='last')
【终端输出】
0 False
1 True
2 False
dtype: bool
【keep=False】
df对象输出 keep=False输出
姓名 年龄 成绩
0 李四 19 92 0 False
1 王五 20 100 1 True
2 王五 20 100 2 True
keep=False
表示所有重复行都被标记为True,即不保留任何重复行。
第一行输出为False,表示索引为0的数据没有重复出现。
第二行输出为True,表示索引为1的数据有重复行。
第三行输出为True,表示索引为2的数据有重复行。
注意这里的False是布尔值,它的前后不用添加英文引号。
【keep='first'】
keep='first'
表示存在与前面的观测值相同的重复值。如果某个观测值与前面的观测值相同,则该行输出为True,否则为False。
df对象输出 keep='first'输出
姓名 年龄 成绩
0 李四 19 92 0 False
1 王五 20 100 1 False
2 王五 20 100 2 True
第一行输出为False,表示索引为0的数据在之前的行中没有重复出现。
第二行输出为False,表示索引为1的数据在之前的行中没有重复出现。
第三行输出为True,表示索引为2的数据在之前的行中有重复出现。
注意这里的'first'是字符串变量,前后要添加英文引号。
【keep='last'】
keep='last'
表示存在与后面的观测值相同的重复值。如果某个观测值与后面的观测值相同,则该行输出为True,否则为False。
df对象输出 keep='first'输出
姓名 年龄 成绩
0 李四 19 92 0 False
1 王五 20 100 1 True
2 王五 20 100 2 False
第一行输出为False,表示索引为0的数据在之后的行中没有重复出现。
第二行输出为True,表示索引为1的数据在之后的行中有
重复出现。
第三行输出为False,表示索引为2的数据在之后的行中没有有重复出现。
注意这里的'last'是字符串变量,前后要添加英文引号。
【总结】
简单粗暴理解为:
keep = False
与所有数据比较,只要有重复都为True。
keep='last'
与前面的数据比较,第一次出现重复数据标记为False。
keep=False
与后面的数据比较,第一次出现重复数据为标记为True。
5. 课堂练习
【目标任务】
示例4.xlsx
中存储了10万条销售数据,请你查看该数据是否存在重复值。
【代码示例】
# 导入pandas库并简写为pd
import pandas as pd
# 文件的相对对路径
file = r"示例4.xlsx"
# 调用函数:库名.函数名()
# pd是库名
# read_excel是函数名
# io参数=file,file是路径
df = pd.read_excel(file)
# 查找DataFrame对象中的重复值
# duplicates是变量名
duplicates = df.duplicated( )
print(duplicates)
【终端输出】
0 False
1 False
2 False
3 False
4 False
...
99995 False
99996 False
99997 False
99998 False
99999 False
Length: 100000, dtype: bool
观察输出结果,我们发现有10万条数据,我们无法用的肉眼定位哪行是重复行。
解决办法是可以将返回的结果放入[]
中,来查看具体重复的行。
6. df[df.duplicated()]-查看重复行信息
【代码示例】
# 导入pandas库并简写为pd
import pandas as pd
# 要传入的数据类型为字典
# 字典的3个键姓名、年龄、成绩是DataFrame对象的列索引
# 字典的值是DataFrame对象的数据
data = {
'姓名': ['李四', '王五', '王五','王五'],
'年龄': [ 19, 20, 20, 20 ],
'成绩': [ 92, 100, 100, 100]
}
# 实例化类创建对象:对象名 = 类名()
# df是对象名,DataFrame是类名
df = pd.DataFrame(data)
print("*****输出DataFrame对象*****")
print(df)
duplicateds = df[df.duplicated(keep=False)]
print("*****输出重复行*****")
print(duplicateds)
【终端输出】
*****输出DataFrame对象*****
姓名 年龄 成绩
0 李四 19 92
1 王五 20 100
2 王五 20 100
3 王五 20 100
*****输出重复行*****
姓名 年龄 成绩
1 王五 20 100
2 王五 20 100
3 王五 20 100
df[df.duplicated()]
这个语法以后讲解。
用df[df.duplicated()]
查看示例4的重复行信息。
【代码示例】
# 导入pandas库并简写为pd
import pandas as pd
# 文件的绝对路径
file = r"示例4.xlsx"
# 调用函数:库名.函数名()
# pd是库名
# read_excel是函数名
# io参数=file,file是路径
df = pd.read_excel(file)
duplicateds = df[df.duplicated(keep=False)]
print(duplicateds)
【终端输出】
订单编号 日期 省份 订单量 单价 销售额
0 zj001 2023-01-01 00:00:00 广东 0.0 30.0 0.0
1 zj002 2023-01-01 00:00:00 河南 0.0 30.0 0.0
2 zj003 2023-01-01 00:00:00 湖北 1.0 30.0 30.0
3 zj004 2023-01-01 00:00:00 河南 0.0 30.0 0.0
4 zj005 2023-01-01 00:00:00 河南 0.0 30.0 0.0
.. ... ... .. ... ... ...
115 zj016 2023-01-01 00:00:00 河南 1.0 30.0 30.0
116 zj017 2023-01-01 00:00:00 河南 0.0 30.0 0.0
117 zj018 2023-01-01 00:00:00 江苏 1.0 30.0 30.0
118 zj019 2023-01-01 00:00:00 其他 0.0 30.0 0.0
119 zj020 2023-01-01 00:00:00 广东 1.0 30.0 30.0
[120 rows x 6 columns]
【温馨提示】
示例表格文件和代码源文件都存在PDF所在的文件夹里,可以自己实操练习。
没有PDF文件的可以联系作者获取表格文件。