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")
CodePudding user response:
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