公众号:尤而小屋
作者:Peter
编辑:Peter
大家好,我是Peter~
今天带来的文章是关于Pandas中重复值处理。Pandas中处理重复值主要使用的是两个函数:
在本文中模拟了两份不同的数据:
1、一份订单数据,后面会使用
import pandas as pd
import numpy as np
# 导入一份模拟数据:待用
df1 = pd.read_excel("订单重复值.xlsx")
df1
2、模拟的另一份数据:
df2 = pd.DataFrame(np.ones([10,2]), # 生成6*2的全部为1的数据
columns=["col1","col2"]
)
df2
再增加了两个字段:都是从列表中随机有抽样放回的选取
# 增加两列
list1 = ["a","b"]
list2 = [2,3]
# 在列表中随机选择10个元素,有放回抽样
df2["col3"] = np.random.choice(list1,10)
df2["col4"] = np.random.choice(list2,10)
df2
函数的功能是检查数据中是否有重复值,用于标记 Series 中的值、DataFrame 中的记录行是否重复,重复为 True,不重复为 False。
每行数据都是和它前面的记录相比较。
针对DataFrame类型数据:
pandas.DataFrame.duplicated(subset=None,keep='first')
或者针对Series的数据:
pandas.Series.duplicated(keep='first')
keep参数的3种取值解释:
通过这个函数能够判断哪些数据是重复的:重复标记为True,否则为False
df2.duplicated(subset=["col3"]) # 单独看col3列是否重复
# 结果
0 False
1 True
2 False
3 True
4 True
5 True
6 True
7 True
8 True
9 True
dtype: bool
df2.duplicated(subset=["col1"]) # 单独看col1:全部是1,后面全部是重复的
0 False
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
9 True
dtype: bool
上面的两个例子都是看单个字段是否重复,下面的例子是通过查看多个属性:
df2.duplicated(subset=["col3","col4"]) # 同时看col3和col4
0 False
1 True
2 False
3 True
4 True
5 True
6 True
7 False
8 False
9 True
dtype: bool
df2.duplicated(subset=["col3"],keep="last")
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 False # 第一次出现
8 True
9 False # 第一次出现
dtype: bool
df2.duplicated(subset=["col3"],keep="first") # 默认是first
0 False # 第一次出现
1 True
2 False # 第一次出现
3 True
4 True
5 True
6 True
7 True
8 True
9 True
dtype: bool
df2.duplicated(subset=["col3"],keep=False) # 将所有的重复值标记为True
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
9 True
dtype: bool
该函数的作用是删除数据中的重复值
下面是来自官网的参数解释:
上面的结果有两个特点:
subset是可以指定我们想通过哪些属性来进行删除:
1、通过单个属性字段来删除
2、通过多个字段属性来删除
keep参数保留我们想要的数据:第一条还是最后一条
1、keep="first"
2、keep="last"
通过duplicated()查看数据是否重复,可以看多索引为7和9的数据为False,因为它们是最后一次出现
该参数表示的是生成数据的索引是原数据的索引还是直接重新排名
如果是使用默认值False:
如果inplace使用True,不会生成数据,因为是在原数据的基础上修改的,导致原数据直接变化了:我们直接看df2
在文章的最开始,我们已经导入了数据,几点需求说明:
比如订单S1,存在3条状态,有两条是通过的,但是我们只想取出最近的一条通过的数据:2021-01-06
解决步骤1:先找出通过的全部订单,发现只有S7没有通过
通过下面的代码也能够找出最终是通过的订单:
order_pass = df1.query("状态 == '通过'")["订单号"].unique()
order_pass
解决步骤2:筛选出最终状态为通过的订单信息,下面提供了两种方式
解决步骤3:对df3进行去重即可
df3.drop_duplicates(
subset="订单号", # 根据订单号去重
keep="last", # 保留最后一条
inplace=True, # 原地修改
ignore_index=True # 索引重排
)
df3 # 结果中没有S7
Pandas的文章已经形成连载,欢迎关注阅读:
推荐阅读
尤而小屋,一个温馨的小屋。小屋主人,一手代码谋求生存,一手掌勺享受生活,欢迎你的光临