【问题标题】:Drop consecutive duplicate rows based on condition根据条件删除连续重复行
【发布时间】:2021-12-20 08:37:18
【问题描述】:

我目前有这个数据框:

id  date       outcome
3   03/05/2019  no
3   29/05/2019  no
3   04/09/2019  no
3   30/10/2019  yes
3   03/05/2020  no
5   03/12/2019  no
5   26/12/2019  no
5   27/01/2020  yes
5   03/06/2020  yes
6   04/05/2019  no
6   27/10/2019  no
6   26/11/2019  yes
6   28/11/2019  yes
6   29/11/2019  yes
6   13/04/2020  yes
6   14/04/2020  yes
6   24/04/2020  no
6   30/04/2020  no
6   05/05/2020  no

按id分组,按日期升序排列。

如果后面的行具有相同的结果,我想删除当前行。但是,如果一行的结果是肯定的,那么下一行必须是第一个否定的。这是上述数据框的预期结果:

id  date       outcome
3   04/09/2019  no
3   30/10/2019  yes
3   03/05/2020  no
5   26/12/2019  no
5   03/06/2020  yes
6   27/10/2019  no
6   14/04/2020  yes
6   24/04/2020  no

目前我正在这样做:

m1 = (df['outcome'] != df['outcome'].shift()).cumsum()
updated_df = df.groupby([df['id'],m1]).tail(1)

但是,这只给了我分组是/否计数的最后一个值(是/否)。如何以尽可能熊猫的方式应用条件?

【问题讨论】:

  • 我不明白这个条件。对于id=3,“是”之后的行(即日期为 03/05/2020 的行)不是结果为“否”的组的第一行,但它仍然存在于预期输出中。
  • @HarryPlotter 这有点棘手,一开始我弄错了。基本上它是删除连续的重复项,保留最后一个,除非在“是”之后,保留第一个。一切,每组。
  • @mozway 这更有意义,感谢您的清理!

标签: python pandas dataframe time-series


【解决方案1】:

IIUC,您需要两个步骤。首先计算一个掩码以检查结果是否与下一个结果不同(保留最后一个),或者遵循每组完成所有操作。这会导致您想要的过滤,除非在“是”之后您将有一个副本。(“是”后保留,“最后一个”丢弃)

其次,再次检查连续结果的差异,但这次保留第一个。

# step 1
m1 = df['outcome']
m2 = m1.groupby(df['id']).shift(-1)
m3 = m1.groupby(df['id']).shift().eq('yes')&m1.eq('no')

df2 = df[~m1.eq(m2)|m3]

# step 2
m4 = df2['outcome']
m5 = m4.groupby(df['id']).shift()
df2[~m4.eq(m5)]

输出:

    id        date outcome
2    3  04/09/2019      no
3    3  30/10/2019     yes
4    3  03/05/2020      no
6    5  26/12/2019      no
8    5  03/06/2020     yes
10   6  27/10/2019      no
15   6  14/04/2020     yes
16   6  24/04/2020      no

【讨论】:

  • 感谢您的回答,这非常有效。这不是必需的,只是出于好奇,假设您想在“是”之前保留一个“否”(基本上可能有多个“否”,例如,两个“是”之间有 5 个“否” ,您可以在其中选择第一个和最后一个“否”)。这将如何实现?这需要大量的口罩吗?
  • @TSRAI 这取决于,如果您只想获得这些值,这很容易。更棘手的部分是将所有内容结合起来。如果条件太多,可能值得根据各种条件独立提取行,然后将所有内容重新连接到单个数据框中。
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2017-11-23
  • 1970-01-01
相关资源
最近更新 更多