我目前有这个数据框:
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/