Search code examples
pythonpandasdataframeinterpolationfillna

interpolate between first and last valid values then fill Nan values by zeros for dataframe columns


I have csv file like the below table:

depth x1 x2 x3
depth x1 x2 x3
1000 Nan Nan Nan
1001 Nan Nan Nan
1002 Nan Nan Nan
1003 Nan 10 Nan
1004 Nan Nan Nan
1005 Nan Nan 10
1006 Nan Nan Nan
1007 10 Nan Nan
1008 11 Nan Nan
1009 12 Nan Nan
1010 13 Nan Nan
1011 14 Nan 15
1012 15 20 Nan
1013 Nan Nan Nan
1014 Nan Nan Nan
1015 18 Nan Nan
1016 19 Nan Nan
1017 20 Nan Nan
1018 21 Nan 20
1019 22 Nan Nan
1020 23 Nan Nan
1021 24 25 Nan
1022 25 Nan Nan
1023 26 Nan Nan
1024 27 Nan 25
1025 28 15 Nan
1026 Nan Nan Nan
1027 Nan Nan Nan
1028 Nan Nan Nan

I want interpolate between first and last valid values then fill Nan values by zeros the result should be like that

depth x1 x2 x3
1000 0 0 0
1001 0 0 0
1002 0 0 0
1003 0 10 0
1004 0 11.11111111 0
1005 0 12.22222222 10
1006 0 13.33333333 10.83333333
1007 10 14.44444444 11.66666667
1008 11 15.55555556 12.5
1009 12 16.66666667 13.33333333
1010 13 17.77777778 14.16666667
1011 14 18.88888889 15
1012 15 20 15.71428571
1013 16 20.55555556 16.42857143
1014 17 21.11111111 17.14285714
1015 18 21.66666667 17.85714286
1016 19 22.22222222 18.57142857
1017 20 22.77777778 19.28571429
1018 21 23.33333333 20
1019 22 23.88888889 20.83333333
1020 23 24.44444444 21.66666667
1021 24 25 22.5
1022 25 22.5 23.33333333
1023 26 20 24.16666667
1024 27 17.5 25
1025 28 15 25
1026 28 0 0
1027 28 0 0
1028 28 0 0

I have tried the below code but it does not give the correct result

import pandas as pd
df = pd.read_csv(r"C:\Users\mohamed\OneDrive\Desktop\test_interpolate.csv")
df = df.interpolate()
df = df.fillna(0)
print (df)
df.to_csv(r"C:\Users\mohamed\OneDrive\Desktop\result.csv")

Solution

  • You can limit the interpolation to the inner NaN using limit_area='inside' (this is well covered in the documentation of interpolate):

    df = df.interpolate(limit_area='inside').fillna(0)
    

    output:

        depth    x1         x2         x3
    0    1000   0.0   0.000000   0.000000
    1    1001   0.0   0.000000   0.000000
    2    1002   0.0   0.000000   0.000000
    3    1003   0.0  10.000000   0.000000
    4    1004   0.0  11.111111   0.000000
    5    1005   0.0  12.222222  10.000000
    6    1006   0.0  13.333333  10.833333
    7    1007  10.0  14.444444  11.666667
    8    1008  11.0  15.555556  12.500000
    9    1009  12.0  16.666667  13.333333
    10   1010  13.0  17.777778  14.166667
    11   1011  14.0  18.888889  15.000000
    12   1012  15.0  20.000000  15.714286
    13   1013  16.0  20.555556  16.428571
    14   1014  17.0  21.111111  17.142857
    15   1015  18.0  21.666667  17.857143
    16   1016  19.0  22.222222  18.571429
    17   1017  20.0  22.777778  19.285714
    18   1018  21.0  23.333333  20.000000
    19   1019  22.0  23.888889  20.833333
    20   1020  23.0  24.444444  21.666667
    21   1021  24.0  25.000000  22.500000
    22   1022  25.0  22.500000  23.333333
    23   1023  26.0  20.000000  24.166667
    24   1024  27.0  17.500000  25.000000
    25   1025  28.0  15.000000   0.000000
    26   1026   0.0   0.000000   0.000000
    27   1027   0.0   0.000000   0.000000
    28   1028   0.0   0.000000   0.000000