我正在处理时间序列数据。从数据框列中删除小于或等于阈值的连续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。
答案 0 :(得分:2)
有几种方法,但这就是我做的方式:
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)
步骤。
答案 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