大熊猫通过非Nan值之前和之后的值来填充Nan

时间:2019-01-29 05:17:38

标签: python pandas

我想用平均相邻元素填充df的{​​{1}}。

考虑一个数据框:

nan

我想要的输出是:

df = pd.DataFrame({'val': [1,np.nan, 4, 5, np.nan, 10, 1,2,5, np.nan, np.nan, 9]})
    val
0   1.0
1   NaN
2   4.0
3   5.0
4   NaN
5   10.0
6   1.0
7   2.0
8   5.0
9   NaN
10  NaN
11  9.0

我已经研究了其他解决方案,例如Fill cell containing NaN with average of value before and after,但是在两个或多个连续 val 0 1.0 1 2.5 2 4.0 3 5.0 4 7.5 5 10.0 6 1.0 7 2.0 8 5.0 9 7.0 <<< deadend 10 7.0 <<< deadend 11 9.0 的情况下,此方法将无效。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:32)

使用ffill + bfill并除以2:

df = (df.ffill()+df.bfill())/2

print(df)
     val
0    1.0
1    2.5
2    4.0
3    5.0
4    7.5
5   10.0
6    1.0
7    2.0
8    5.0
9    7.0
10   7.0
11   9.0

编辑::如果第一个元素和最后一个元素包含NaN,则使用(Dark  建议):

df = pd.DataFrame({'val':[np.nan,1,np.nan, 4, 5, np.nan, 
                          10, 1,2,5, np.nan, np.nan, 9,np.nan,]})
df = (df.ffill()+df.bfill())/2
df = df.bfill().ffill()

print(df)
     val
0    1.0
1    1.0
2    2.5
3    4.0
4    5.0
5    7.5
6   10.0
7    1.0
8    2.0
9    5.0
10   7.0
11   7.0
12   9.0
13   9.0

答案 1 :(得分:1)

虽然连续有多个nan,但不会产生您指定的确切输出,其他访问此页面的用户实际上可能更喜欢方法interpolate()的效果:

df = df.interpolate()

print(df)
     val
0    1.0
1    2.5
2    4.0
3    5.0
4    7.5
5   10.0
6    1.0
7    2.0
8    5.0
9    6.3
10   7.7
11   9.0