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

2022-04-14 00:00:00 python pandas nan

问题描述

我正在处理时间序列数据。我在从数据帧列中删除小于或等于阈值的连续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
    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

如果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

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


解决方案

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

  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

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

相关文章