删除 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
我想删除 df
中 Ai
值介于 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
我遇到了一个看似简单但找不到合适解决方案的问题。
考虑给定的 Pandas 数据帧 df
,由多列 A1、A2 等组成,让 Ai
成为其填充的列之一,例如如下所示:
Ai |
---|
25 |
30 |
30 |
NaN |
12 |
15 |
15 |
NaN |
我想删除 df
中 Ai
值介于 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