如何从Python中的数据框列中删除少于k个连续的NaN

时间:2018-02-15 05:15:04

标签: python pandas

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

Identifying consecutive NaN's with pandas:标识连续NaN的存在位置和计数内容。

Pandas: run length of NaN holes:输出运行NaNs的长度编码

沿着这条小路还有更多其他人,但他们都没有告诉我们如何在识别后删除它们。

我找到了一个类似的解决方案但是在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。

2 个答案:

答案 0 :(得分:2)

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

  1. 使用整齐的cumsum技巧
  2. 确定连续数字组
  3. 使用groupby + transform确定每个组的大小
  4. 识别阈值范围内的NaN组
  5. 使用布尔索引过滤掉它们。
  6. 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)步骤。

答案 1 :(得分:0)

您可以创建一个指标列来计算连续的nans。

k = 3
(
df.groupby(pd.notna(df.a).cumsum())
.apply(lambda x: x.dropna() if pd.isna(x.a).sum() <= k else x)
.reset_index(drop=True)
)

Out[375]: 
        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