【发布时间】:2018-03-20 22:29:14
【问题描述】:
如果连续的 NAN 少于 3 个,我想填充我的 pandas 系列中的缺失值。
缺失值的原始系列:
s=pd.Series(pd.np.random.randn(20))
s[[1,3,5,7,12,13,14,15, 18]]=pd.np.nan
给予:
0 0.444025
1 NaN
2 0.631753
3 NaN
4 -0.577121
5 NaN
6 1.299953
7 NaN
8 -0.252173
9 0.287641
10 0.941953
11 -1.624728
12 NaN
13 NaN
14 NaN
15 NaN
16 0.998952
17 0.195698
18 NaN
19 -0.788995
但是,使用带有限制的 pandas.fillna() 只会填充指定的值的数量(而不是预期的连续 NAN 的数量):
s.fillna(value=0, limit=3) #Fails to fill values at position 7 and forward
所需的输出将在位置 1、3、5、7 和 18 处用 0 填充 NAN。它将在位置 12-15 留下一系列 4 个 NaN。
SO 上的文档和其他帖子尚未解决此问题(例如 here)。文档似乎暗示此限制将适用于连续的 NAN,而不是将填充的整个数据集中的整体 #。谢谢!
【问题讨论】:
-
感谢您的解决方案。我只是很惊讶没有更简单的方法可以做到这一点!
-
使用“shift”会更简单吗?即,首先用
long_nan_gaps= s.index[s.shift(1).isnull() & s.shift(-1).isnull() & s.isnull()]存储所有长NAN间隙的位置,然后用0填充所有NAN,然后在事后将保存的位置恢复到NAN?我很欣赏许多解决方案;只是想知道您在下面提出的一个是否比我在这里为自己想出的更好(我认为这太丑陋/令人困惑)。