删除 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

我想删除dfAi 值介于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 和列值更改之间的行的主要内容,如果未能解决你的问题,请参考以下文章

关于保留一列值满足某些约束的行[重复]

在EXCEL中 如何用VBA查找某特定单元格并返回该单元格的行和列值?

如何在 VBA 中显示选择查询的行和列值

如何删除表格中行和列之间不需要的空间?

PostgreSQL,删除具有重新编号列值的行

Python pandas:选择列值为null / None / nan的行[重复]