删除 NaN 和列值更改之间的行

Delete rows between NaN and a change in the column value

我遇到了一个看似简单但找不到合适解决方案的问题。

考虑给定的 Pandas 数据帧 df,由多列 A1、A2 等组成,让 Ai 成为其填充的列之一,例如如下所示:

Ai
25
30
30
NaN
12
15
15
NaN

我想删除 dfAi 值介于 NaN 和值“进一步变化”之间的所有行,以便我的输出(对于第 [=11 列) =]) 将是:

Ai
25
NaN
12
NaN

任何关于如何这样做的想法将不胜感激。非常感谢您。

更新

与之前的解决方案类似,但每组都有一个过滤器以保留早期的重复项

m = df['Ai'].isna()
df.loc[((m|m.shift(fill_value=True))
        .groupby(df['Ai'].ne(df['Ai'].shift()).cumsum())
        .filter(lambda d: d.sum()>0).index
       )]

输出:

     Ai
0  25.0
1  25.0
2  25.0
5   NaN
6  30.0
7  30.0
9   NaN

原回答

这相当于选择 NaN 和下面的行。你可以使用面具:

m = df['Ai'].isna()
df[m|m.shift(fill_value=True)]

输出:

     Ai
0  25.0
3   NaN
4  12.0
7   NaN