我正在处理时间序列数据。我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题。我尝试查看一些链接,例如:
:标识连续 NaN 出现的位置以及计数。
Pandas:NaN 孔的游程长度 https://stackoverflow.com/questions/16857407/pandas-run-length-of-nan-holes:输出 NaN 的游程长度编码
这条路上还有很多其他人,但没有一个人真正告诉我们在识别后如何删除它们。
我找到了一个类似的解决方案,但那是在 R 中:如何删除列中超过 2 个连续的 NA? https://stackoverflow.com/questions/42668059/how-to-remove-more-than-2-consecutive-nas-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。
有几种方法,但我是这样做的:
- 使用整齐的方法确定连续数字组
cumsum
trick
- Use
groupby
+ transform
确定每个组的大小
- 识别阈值内的 NaN 组
- 使用布尔索引过滤掉它们。
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)
如果您想要单调递增的整数索引,请在最后执行步骤。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)