首页 > 解决方案 > 只保留一个值的第一次出现,直到它更改为另一个值

问题描述

我的数据集如下所示:

 id      mz_id      time        duration
  1        a        0:00           0:10
  1        a        0:01           0:10
  1        a        0:05           0:10
  1        a        0:07           0:10
  1        a        0:09           0:10
  1        b        5:10           1:10
  1        b        15:10          1:10
  1        b        35:10          1:10
  1        a        1:10:05        0:15
  1        a        1:20:07        0:15
  1        b        2:10:05        1:10
  1        c        3:20:07        0:15

等等..

我想保持值 mz_id 的首次出现,如下所示:

 id      mz_id      time        duration
  1        a        0:00           0:10
  1        b        5:10           1:10
  1        a        1:10:05        0:15
  1        b        2:10:05        1:10
  1        c        3:20:07        0:15

这对 mz_id 和 duration 不是唯一的,我不知道在这种情况下如何删除它们......我删除重复项应该只基于 - 始终保持 mz_id 的第一个外观,直到它改变。

标签: pandas

解决方案


IIUC,使用辅助系列和groupby+first

df.groupby(df['mz_id'].ne(df['mz_id'].shift()).cumsum()).first().reset_index(drop=True)

   id mz_id     time duration
0   1     a     0:00     0:10
1   1     b     5:10     1:10
2   1     a  1:10:05     0:15
3   1     b  2:10:05     1:10
4   1     c  3:20:07     0:15

详细信息:检查下一行是否与当前行相同,然后执行 acumsum()为每个更改的组分配一个组,然后按该系列分组并首先返回

df['mz_id'].ne(df['mz_id'].shift())

0      True
1     False
2     False
3     False
4     False
5      True
6     False
7     False
8      True
9     False
10     True
11     True

因此,对于在下一行中具有相同值的所有第一行,这将返回 true。

但是,正如@Datanovice 指出的那样,在您的示例中,由于您只是占据第一行,因此下面的内容也可以使用。

df[df['mz_id'].ne(df['mz_id'].shift())]

推荐阅读