代码之家  ›  专栏  ›  技术社区  ›  Alex_Y

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

  •  0
  • Alex_Y  · 技术社区  · 2 年前

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

    id 地位 时间戳
    111 a. 2023年8月29日12:39
    111 a. 2023年8月29日12:45
    111 b 2023年8月29日12:47
    111 c 2023年8月29日12:50
    111 a. 2023年8月29日12:50
    112 a. 2023年8月29日12:50
    112 b 2023年8月29日13:09
    112 c 2023年8月29日13:40
    112 b 2023年8月29日13:50
    112 a. 2023年8月29日13:55

    我需要删除删除状态序列中的重复,但仅适用于状态在相邻记录中重复的情况。这意味着id 111可以有多个状态==“A”,但如果之前的状态也是“A”的话,我需要删除第二个“A”。 所以新表应该是这样的(删除状态相同的第二行):

    id 地位 时间戳
    111 a. 2023年8月29日12:39
    111 b 2023年8月29日12:47
    111 c 2023年8月29日12:50
    111 a. 2023年8月29日12:50
    112 a. 2023年8月29日12:50
    112 b 2023年8月29日13:09
    112 c 2023年8月29日13:40
    112 b 2023年8月29日13:50
    112 a. 2023年8月29日13:55

    因此,最终我们为每个id都有一个唯一的状态序列,没有重复。

    感谢您的帮助,因为我坚持使用一些非常缓慢和直率的方法将每一行与前一行进行比较,但数据集非常庞大,>500万条记录。

    1 回复  |  直到 2 年前
        1
  •  1
  •   jezrael    2 年前

    获取偏移值后的多列的差,并按获取行 boolean indexing :

    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