[英]remove all rows in pandas dataframe with N or more consecutive NaNs
[英]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。
有幾種方法,但這就是我做到的方式:
cumsum
技巧確定連續數字組 groupby
+ transform
確定每個組的大小 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.