如果我有一些缺失值,想用前后数值的平均值替换所有NaN,请问如何操作?
我知道我可以使用pandas.DataFrame.fillna
函数并选择method='ffill'
或method='bfill'
选项来将NaN值替换为前面或后面的值,但我想在数据框中应用这些值的平均值,而不是遍历行和列。
如果我有一些缺失值,想用前后数值的平均值替换所有NaN,请问如何操作?
我知道我可以使用pandas.DataFrame.fillna
函数并选择method='ffill'
或method='bfill'
选项来将NaN值替换为前面或后面的值,但我想在数据框中应用这些值的平均值,而不是遍历行和列。
DataFrame.interpolate()
。以下是Panda文档中的示例:In [65]: df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
....: 'B': [.25, np.nan, np.nan, 4, 12.2, 14.4]})
....:
In [66]: df
Out[66]:
A B
0 1.0 0.25
1 2.1 NaN
2 NaN NaN
3 4.7 4.00
4 5.6 12.20
5 6.8 14.40
In [67]: df.interpolate()
Out[67]:
A B
0 1.0 0.25
1 2.1 1.50
2 3.4 2.75
3 4.7 4.00
4 5.6 12.20
5 6.8 14.40
可能有点晚,但我刚有同样的问题,而这页上唯一的答案并没有满足我的期望。那就是为什么现在我来回答。
你的帖子说明你想用平均值替换NaNs
,然而,插值对我来说不是正确的答案,因为它会用线性方程填充空单元格。如果你想用前后行的平均值填充它。这段代码帮了我:
dfb = df.fillna(method='bfill')
dff = df.fillna(method='ffill')
dfmeans = (dfb+dff)/2
dfmeans
对于上面的数据框,结果如下所示
A B
0 1.0 0.250
1 2.1 2.125
2 3.4 2.125
3 4.7 4.000
4 5.6 12.200
5 6.8 14.400
您可以看到,在A列的索引2处,它们都产生了3.4,因为插值是(2.1 + 4.7)/ 2,但在B列中,这些值不同。
关于一行脚本及其在时间序列中的应用,您可以查看此帖子:Pandas DataFrame中时间分布不均匀值之间的平均值
limit
选项值得一提,它可以防止填充过多连续的NaN。 - Skippy le Grand Gourou