簡體   English   中英

從pandas DataFrame中刪除少於K個連續的NaN

[英]Remove lesser than K consecutive NaNs from pandas DataFrame

我正在處理時間序列數據。 從數據框列中刪除小於或等於閾值的連續NaN時,我遇到問題。 我試着查看一些鏈接,如:

使用pandas識別連續的NaN :識別連續NaN存在的位置和計數。

Pandas:運行NaN空洞的長度:輸出運行NaNs的長度編碼

沿着這條車道還有更多的其他車道,但它們都沒有告訴我們如何在識別之后將它們移除。

我找到了一個類似的解決方案但是在R中: 如何在一列中刪除超過2個連續的NA?

我想用Python解決方案。

所以這是一個例子:

這是我的dataframe專欄:

            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) df = df[m]; df.reset_index(drop=True)如果你想要一個單調遞增的整數索引,最后一步。

您可以創建一個指標列來計算連續的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM