b = pd.DataFrame({"a": [np.nan, 1, np.nan, 2, np.nan,3,np.nan]})
a = b[b['a'].isna()]
print('After :',b['a'])
#######Solution One######
for x in a.iterrows() :
pre = x[0] - 1
post = x[0] +1
if pre < 0 or post >= len(b['a']) :
pass
else :
if not(np.isnan(b.iloc[pre,0])) and not(np.isnan(b.iloc[post,0])) :
b.iloc[x[0],0] = 0
print('Before :',b['a'])
######Solution Two#######
def series_extract(index, series):
return map(np.isnan, series[[index-1, index, index+1]])
def fill_in_between_na(df, column):
series = df[column]
index = []
for i in range(1,len(series)-1) :
mask = np.array([False,True,False]) == np.array(series_extract(i, series))
if all(mask):
index.append(i)
df[column][index] = 0
return df
fill_in_between_na(b, 'a')
print('Before :',b['a'])