当NaN多于限制时如何限制pandas插值

Ben*_*751 7 interpolation dataframe python-3.x pandas

我想插入一个 pandas 数据框,但我找不到解决我的问题的简单方法。这是我的熊猫 df:

df = pandas.DataFrame(numpy.array([numpy.nan, 1, 1, numpy.nan, \
    numpy.nan, 1, numpy.nan, numpy.nan, numpy.nan, numpy.nan, 1]),columns=['a'])

      a
0   NaN
1   1.0
2   1.0
3   NaN
4   NaN
5   1.0
6   NaN
7   NaN
8   NaN
9   NaN
10  1.0
Run Code Online (Sandbox Code Playgroud)

我想要以下结果:

      a
0   NaN
1   1.0
2   1.0
3   1.0
4   1.0
5   1.0
6   NaN
7   NaN
8   NaN
9   NaN
10  1.0
Run Code Online (Sandbox Code Playgroud)

为此,我使用插值函数,但它总是推断数据:

df2=df.interpolate(limit=2, limit_area='inside' ,method='linear')
      a
0   NaN
1   1.0
2   1.0
3   1.0
4   1.0
5   1.0
6   1.0
7   1.0
8   NaN
9   NaN
10  1.0
Run Code Online (Sandbox Code Playgroud)

仅当限制参数范围内存在非 NaN 值时是否可以进行插值?(即:第 6 行和第 7 行的值应该是 NaN,因为第 8 行也是 NaN)。我的印象是 limit_area 仅适用于 df 的末尾。

谢谢

ALo*_*llz 5

要实现您想要的目标,首先创建一个系列,该系列计算NaN每组的连续值的数量NaN并将该值广播回组中的每行。然后对整个系列进行插值,并使用maskNaN应该插值的所有内容。

s = df['a'].notnull()
s = s.ne(s.shift()).cumsum()

m = df.groupby([s, df['a'].isnull()])['a'].transform('size').where(df['a'].isnull())
#0     1.0
#1     NaN
#2     NaN
#3     2.0
#4     2.0
#5     NaN
#6     4.0
#7     4.0
#8     4.0
#9     4.0
#10    NaN

df.interpolate(limit_area='inside', method='linear').mask(m>2)
Run Code Online (Sandbox Code Playgroud)
      a
0   NaN
1   1.0
2   1.0
3   1.0
4   1.0
5   1.0
6   NaN
7   NaN
8   NaN
9   NaN
10  1.0
Run Code Online (Sandbox Code Playgroud)