看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求为有一列数据,需要对每个数据进行标注,标注按从上到下,其是否在此列中第一次出现。
数据如下:
import pandas as pd
df = pd.DataFrame({"ID": [123, 234, 123, 234, 678]})
df
'''
ID
0 123
1 234
2 123
3 234
4 678
'''
现需要增加一列,如果这个数据之前没出现过记为 True,如果出现过记为 False。
可以定义一个函数应用在行上,获取当前行之前的 ID 列值组成的 list,然后再判断并返回当前行的 ID 值是否在之前的列表里。
还有一个方法,就是用重复值检测是否重复值的第一个,标记为 True,其他为 False。
根据思路,需求的实现代码事下:
# 定义一个判断方法
def fun(s):
s = s.copy() # 接收每行的 Series
# 获取当前行之前的 ID 列值组成的 list
p_list = df.ID.loc[:s.name-1].to_list()
# 返回当前行的 ID 值是否在之前的列表里
return s.ID not in p_list
# 调用方法
df.assign(是否是新ID=df.apply(fun, axis=1))
'''
ID 是否是新ID
0 123 True
1 234 True
2 123 False
3 234 False
4 678 True
'''
一行代码版本,也得得到上边同样的结果:
# 一行代码版本
df.assign(是否是新ID=df.apply(lambda s: s.ID not in df.ID.loc[:s.name-1].to_list(), axis=1))
但以上方法性能比较差,我们按思路 2 来实现一下:
# 不是第一次出现为 False
df.assign(是否是新ID=~df.duplicated(['ID'], keep='first'))
也同样得到结果。
(完)
更新时间:2024-08-18 15:37:40 标签:pandas python 重复值