如何在pandas DataFrame中将NaN替换为前后值的平均值?

3

如果我有一些缺失值,想用前后数值的平均值替换所有NaN,请问如何操作?

我知道我可以使用pandas.DataFrame.fillna函数并选择method='ffill'method='bfill'选项来将NaN值替换为前面或后面的值,但我想在数据框中应用这些值的平均值,而不是遍历行和列。

2个回答

5
尝试使用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

感谢您的回答。我想知道如何计算两个连续的NaN。我在网上找到了线性插值的公式,适用于点(例如(x1,y1)和(x2,y2))。在DataFrame.interplate()的描述中,默认情况下按列应用,但没有更多关于如何计算此情况的细节。 - Yasmin
1
对于默认的插值方法'linear',索引将被忽略。每个连续NaN之间的差值是通过已知值之间的差值除以步数计算的。在上面的例子中B列中,已知值之间的差为4.00-0.25=3.75.步数是一排NaN的数量+1=2+1=3。delta是3.75/3=1.25。因此,第一个NaN为0.25+1.25=1.50,第二个NaN为1.50+1.25=2.75。 - RootTwo
limit选项值得一提,它可以防止填充过多连续的NaN。 - Skippy le Grand Gourou

1

可能有点晚,但我刚有同样的问题,而这页上唯一的答案并没有满足我的期望。那就是为什么现在我来回答。 你的帖子说明你想用平均值替换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中时间分布不均匀值之间的平均值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接