Interpolar solo si NaN solo

¿Hay alguna manera en los pandas de interpolar solo puntos de datos faltantes? Es decir, si hay más de 2 NaN consecutivos, me gustaría dejarlos solos.

así, como ejemplo:

s = pd.Series([1, None, 2, 3, None, None, 4.5]) d.interpolate(limit=1) 

me da

 [ 1.0, 1.5, 2.0, 3.0, 3.5, NaN, 4.5 ] 

pero me gustaría conseguir

 [ 1.0, 1.5, 2.0, 3.0, NaN, NaN, 4.5 ] 

Si ayuda, tengo una lista de los índices donde solo hay valores perdidos.

Mi opinión es que esta sería una gran capacidad para incluir en interpolate .
Dicho esto, esto se reduce a enmascarar los lugares donde existen más de un np.nan . numpy eso con un numpy lógica numpy en una función práctica.

 def cnan(s): v = s.values k = v.size n = np.append(np.isnan(v), False) m = np.empty(k, np.bool8) m.fill(True) i = np.where(n[:-1] & n[1:])[0] + np.arange(2) m[i[i < k]] = False return m s.interpolate().where(cnan(s)) 0 1.0 1 1.5 2 2.0 3 3.0 4 NaN 5 NaN 6 4.5 dtype: float64 

Para aquellos interesados ​​en una solución general utilizando técnicas avanzadas de numpy

 import pandas as pd import numpy as np from numpy.lib.stride_tricks import as_strided as strided def mask_knans(a, x): a = np.asarray(a) k = a.size n = np.append(np.isnan(a), [False] * (x - 1)) m = np.empty(k, np.bool8) m.fill(True) s = n.strides[0] i = np.where(strided(n, (k + 1 - x, x), (s, s)).all(1))[0][:, None] i = i + np.arange(x) i = pd.unique(i[i < k]) m[i] = False return m 

manifestación

 a = np.array([1, np.nan, np.nan, np.nan, 3, np.nan, 4, 5, np.nan, np.nan, 6, 7]) print(mask_knans(a, 3)) [ True False False False True True True True True True True True] 
 s[(s.shift(-1).notnull()) & (s.shift(1).notnull())] = (s.shift(-1) + s.shift(1))/2 

Actualmente,

 s[s.isnull()] = (s.shift(-1) + s.shift(1))/2 

Funciona también, si estás haciendo una simple interpolación.