Pandas - 如果特定列值等于上一条记录 [duplicate] ,则删除记录

Pandas - drop records if on specific column value is equal to previous record [duplicate]

提问人:Alex_Y 提问时间:11/13/2023 更新时间:11/13/2023 访问量:27

问:

我有一个如下所示的数据帧(按 id、时间和状态排序):

编号 地位 时间戳
111 一个 29.08.2023 12:39
111 一个 29.08.2023 12:45
111 B 29.08.2023 12:47
111 C 29.08.2023 12:50
111 一个 29.08.2023 12:50
112 一个 29.08.2023 12:50
112 B 29.08.2023 13:09
112 C 29.08.2023 13:40
112 B 29.08.2023 13:50
112 一个 29.08.2023 13:55

我需要删除状态序列中的重复项,但仅限于状态重复出现在彼此记录旁边的情况。这意味着 id 111 可以有多个状态 == 'A',但如果以前的状态也是 'A',我需要删除第二个 'A'。 所以新表应该是这样的(删除具有相同状态的第二行):

编号 地位 时间戳
111 一个 29.08.2023 12:39
111 B 29.08.2023 12:47
111 C 29.08.2023 12:50
111 一个 29.08.2023 12:50
112 一个 29.08.2023 12:50
112 B 29.08.2023 13:09
112 C 29.08.2023 13:40
112 B 29.08.2023 13:50
112 一个 29.08.2023 13:55

因此,最后,我们为每个 id 提供了唯一的状态序列,没有重复。

感谢任何帮助,因为我坚持使用一些非常缓慢和生硬的方法将每一行与前一行进行比较,但数据集非常庞大,> 5M 条记录。

python pandas group-by 重复项

评论


答:

1赞 jezrael 11/13/2023 #1

通过布尔索引获取多列移位值的差异并获取行:

out = df[df[['id','status']].ne(df[['id','status']].shift()).any(axis=1)]
print (out)
    id status         timestamp
0  111      A  29.08.2023 12:39
2  111      B  29.08.2023 12:47
3  111      C  29.08.2023 12:50
4  111      A  29.08.2023 12:50
5  112      A  29.08.2023 12:50
6  112      B  29.08.2023 13:09
7  112      C  29.08.2023 13:40
8  112      B  29.08.2023 13:50
9  112      A  29.08.2023 13:55