11. df.duplicated-查找重复值

文摘   2023-09-11 23:51   云南  

【目录】


  • 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 = {
    '姓名': ['李四''王五''王五'],
    '年龄': [ 192020, ],
    '成绩': [ 92100100]
}

# 实例化类创建对象:对象名 = 类名()
# 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 = {
    '姓名': ['李四''王五''王五','王五'],
    '年龄': [ 19202020 ],
    '成绩': [ 92100100100]
}

# 实例化类创建对象:对象名 = 类名()
# 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文件的可以联系作者获取表格文件。


安迪python学习笔记
python学习笔记,适合初学者。
 最新文章