python - 根据条件删除连续的重复行

标签 python pandas dataframe time-series

我目前有这个数据框:

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分组,date升序

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

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)

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

最佳答案

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

关于python - 根据条件删除连续的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69867653/

相关文章:

python - 将错误记录到两个不同的文件

python - 如何显示正在运行的进程列表 Python?

python - 如何用模式(正则表达式)替换部分字符串在数据框中抛出行

r - 如何对 R 数据框中的多列进行计数和分组?

python - 如何在 python 中进行 groupby 来拆分订单?

python - 为 pandas 数据框均匀分配随机值

python - Pandas 无法读取在 PySpark 中创建的 Parquet 文件

python - 如何在 python 中使用星期几和月份日期来获取年份?

python - Pandas 数据框到Google大查询

python - 如何将元素列表附加到数据框的单个特征中?