删除 NaN 和列值更改之间的行
Posted
技术标签:
【中文标题】删除 NaN 和列值更改之间的行【英文标题】:Delete rows between NaN and a change in the column value 【发布时间】:2021-12-04 06:31:14 【问题描述】:我遇到了一个看似简单但找不到合适解决方案的问题。
考虑给定的 Pandas 数据框df
,由多个列 A1、A2 等组成,并让 Ai
为其填充的列之一,例如:
Ai |
---|
25 |
30 |
30 |
NaN |
12 |
15 |
15 |
NaN |
我想删除df
中Ai
值介于NaN 和其值“进一步变化”之间的所有行,这样我的输出(对于Ai
列)将是:
Ai |
---|
25 |
NaN |
12 |
NaN |
任何关于如何做到这一点的想法将不胜感激。非常感谢您。
【问题讨论】:
您能否更详细地描述“在 NaN 与其值的“进一步变化”之间”的含义?根据您的输出,您似乎正在删除具有重复值的行。 当然,抱歉含糊不清。原则上,我有一个包含许多缺失值的数据集,我根据某些条件回填。因此,在输出中有许多重复的值,但我想删除位于Ai
列中的 NaN 和另一个值之间的行。它们不一定是重复的(例如考虑序列 30,26,NaN;我只想删除 26)。
【参考方案1】:
更新
与之前的解决方案类似,但每个组都有一个过滤器以保留早期的重复项
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
【讨论】:
在我提供的玩具示例中是的,但原则上我可能想保留多行。比如下面:25,25,25,30,30,NaN,30,30,32, NaN
,我想只删除前两个30和32。
@Qwerty992 检查更新
效果很好,非常感谢!以上是关于删除 NaN 和列值更改之间的行的主要内容,如果未能解决你的问题,请参考以下文章