What I'd like to do:
In [2]: b = pd.DataFrame({"a": [np.nan, 1, np.nan, 2, np.nan]})
Out[2]:
a
0 nan
1 1.000
2 nan
3 2.000
4 nan
Expected output:
a
0 nan
1 1.000
2 0
3 2.000
4 nan
As you can see here, only nans that are surrounded by valid values are replaced with 0.
How can I do this?
df.interpolate(limit_area='inside')
looks good to me but it doesn't have an argument to fill with 0s...interpolate
, isna
, notna
and loc
You can use interpolate
and then check which positions have NaN
in your original data, and which are filled in your interpolated, then replace those values with 0
:
s = df['a'].interpolate(limit_area='inside')
m1 = b['a'].isna()
m2 = s.notna()
df.loc[m1&m2, 'a'] = 0
a
0 NaN
1 1.0
2 0.0
3 2.0
4 NaN
shift
and loc
:An easier method would be to check if previous row and next row are not NaN
and fill those positions with 0
:
m1 = df['a'].shift().notna()
m2 = df['a'].shift(-1).notna()
m3 = df['a'].isna()
df.loc[m1&m2&m3, 'a'] = 0
a
0 NaN
1 1.0
2 0.0
3 2.0
4 NaN
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With