从 pandas DataFrame 中删除少于 K 个连续 NaN

Ava*_*rma 5 python nan pandas

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

使用 pandas 识别连续 NaN:识别连续 NaN 出现的位置以及计数。

Pandas:NaN 洞的游程长度:输出 NaN 的游程长度编码

这条路上还有很多其他人,但没有一个人真正告诉我们在识别后如何删除它们。

我找到了一个类似的解决方案,但它是在 R 中: 如何删除列中超过 2 个连续的 NA?

我想要Python的解决方案。

所以这是一个例子:

这是我的数据框列:

            a
    0   36.45
    1   35.45
    2     NaN
    3     NaN
    4     NaN
    5   37.21
    6   35.63
    7   36.45
    8   34.65
    9   31.45
    10    NaN
    11    NaN
    12  36.71
    13  35.55
    14    NaN
    15    NaN
    16    NaN
    17    NaN
    18  37.71
Run Code Online (Sandbox Code Playgroud)

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

            a
    0   36.45
    1   35.45
    2   37.21
    3   35.63
    4   36.45
    5   34.65
    6   31.45
    7   36.71
    8   35.55
    9     NaN
    10    NaN
    11    NaN
    12    NaN
    13  37.71
Run Code Online (Sandbox Code Playgroud)

我该如何删除小于或等于某个阈值 (k) 的连续 NaN。

cs9*_*s95 4

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

  1. cumsum使用巧妙的技巧确定连续数字组
  2. 使用groupby+transform确定每个组的大小
  3. 识别阈值内的 NaN 组
  4. 使用布尔索引过滤掉它们。

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

df[m]

a
0   36.45
1   35.45
5   37.21
6   35.63
7   36.45
8   34.65
9   31.45
12  36.71
13  35.55
14    NaN
15    NaN
16    NaN
17    NaN
18  37.71
Run Code Online (Sandbox Code Playgroud)

df = df[m]; df.reset_index(drop=True)如果您想要单调递增的整数索引,您可以在最后执行步骤。