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