如何使用同一列中最后3行的平均值来填充(归因)?

时间:2019-10-22 15:11:08

标签: python pandas

所以我试图用fillna()在大熊猫中估算一些缺失值,但是我真的不知道如何使用同一列中最后3行的平均值进行估算(而不是pandas的平均值)整列),因此,如果有人可以提供帮助,将不胜感激,谢谢

3 个答案:

答案 0 :(得分:0)

您可以这样做:

df.fillna(df.iloc[-3:].mean())

例如:

import pandas as pd
import numpy as np

df = pd.DataFrame({'var1':[1, 2, 3, np.nan, 5, 6, 7],
                   'var2':[np.nan, np.nan, np.nan, np.nan, np.nan, 1, 0]})

   var1  var2
0   1.0   NaN
1   2.0   NaN
2   3.0   NaN
3   NaN   NaN
4   5.0   NaN
5   6.0   1.0
6   7.0   0.0

print(df.fillna(df.iloc[-3:].mean()))

输出:

   var1  var2
0   1.0   0.5
1   2.0   0.5
2   3.0   0.5
3   6.0   0.5
4   5.0   0.5
5   6.0   1.0
6   7.0   0.0

答案 1 :(得分:0)

您可以将fillnarolling(3).mean()一起使用。 shift获得正确的对齐方式。这种方法可以一次填充所有内容,因此对于连续的NaN值,填充是独立的。如果需要迭代填充(填充第一个NaN,则该值将用于计算下一个连续的NaN中的填充值),则无法以这种方式完成。

df = pd.DataFrame({'col1': [np.NaN, 3, 4, 5, np.NaN, np.NaN, np.NaN, 7]})

                        # Fill if 
                        # at least 
                        # one value
df.fillna(df.rolling(3, min_periods=1).mean().shift())  # works for many cols at once

   col1
0   NaN  # Unfilled because < min_periods
1   3.0
2   4.0
3   5.0
4   4.0  # np.nanmean([3, 4, 5])
5   4.5  # np.nanmean([np.NaN, 4, 5])
6   5.0  # np.nanmean([np.NaN, np.naN ,5])
7   7.0

答案 2 :(得分:0)

如果解决了问题,Dan的解决方案就简单得多。如果没有,那么就可以实现:

df2 = df1.fillna('nan')  # Just filling them for the loop
dfrows = df2.shape[0]
dfcols = df2.shape[1]
for row in range(dfrows):
    for col in range(dfcols):
        if df2.iloc[row, col] == ('nan'):
            df2.iloc[row,col] = (df2.iloc[row-1,col] + df2.iloc[row-2,col] + df2.iloc[row-3,col])/3
df2