从Pandas DataFrame中删除少于K个连续NAN

本教程将介绍从Pandas DataFrame中删除少于K个连续NAN的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

从Pandas DataFrame中删除少于K个连续NAN 教程 第1张

问题描述

我正在处理时间序列数据。我在从数据帧列中删除小于或等于阈值的连续NAN时遇到问题。我试着查看了一些链接,如:

Identifying consecutive NaN's with pandas:标识连续NAN的位置和计数。

Pandas: run length of NaN holes:输出NAN的游程编码

这条车道上还有更多其他的,但实际上没有一个告诉我们识别后怎么删除它们。

我找到了一个类似的解决方案,但在R中:
How to remove more than 2 consecutive NA's in a column?

我想要使用Python语言的解决方案。

下面是示例:

这是我的数据框专栏:

a
 036.45
 135.45
 2  NaN
 3  NaN
 4  NaN
 537.21
 635.63
 736.45
 834.65
 931.45
 10 NaN
 11 NaN
 12  36.71
 13  35.55
 14 NaN
 15 NaN
 16 NaN
 17 NaN
 18  37.71

如果k=3,我的输出应该是:

a
 036.45
 135.45
 237.21
 335.63
 436.45
 534.65
 631.45
 736.71
 835.55
 9  NaN
 10 NaN
 11 NaN
 12 NaN
 13  37.71

怎么删除小于或等于某个阈值(K)的连续NAN。

推荐答案

有几种方法,但我是这样做的:

    使用巧妙的cumsum技巧确定连续数字组

    使用groupby+transform确定每个组的大小

    标识阈值内的NAN组

    使用布尔索引筛选出它们。

k = 3 
i = df.a.isnull()
m = ~(df.groupby(i.ne(i.shift()).cumsum().values).a.transform('size').le(k) & i)

df[m]

a
036.45
135.45
537.21
635.63
736.45
834.65
931.45
12  36.71
13  35.55
14 NaN
15 NaN
16 NaN
17 NaN
18  37.71

如果需要单调递增的整数索引,可以执行结尾处的df = df[m]; df.reset_index(drop=True)步骤。

好了关于从Pandas DataFrame中删除少于K个连续NAN的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。