我正在尝试为列中的所有NaNs值填充列的平均值。
import numpy as np
import pandas as pd
table = pd.DataFrame({'A':[1,2,np.nan],
'B':[3,np.nan, np.nan],
'C':[4,5,6]})
def impute_missing_values(table):
for column in table:
for value in column:
if value == 'NaN':
value = column.mean(skipna=True)
else:
value = value
impute_missing_values(table)
table
为什么我的代码出现错误?
答案 0 :(得分:6)
IIUC:
table.fillna(table.mean())
输出:
A B C
0 1.0 3.0 4
1 2.0 3.0 5
2 1.5 3.0 6
答案 1 :(得分:1)
好的,我将其添加为另一个答案,因为我根本不建议这样做。使用pandas方法可矢量化操作以获得更好的性能。 建议尽可能避免使用循环。
不过,这是您的代码的快速修复:
import pandas as pd
import numpy as np
import math
table = pd.DataFrame({'A':[1,2,np.nan],
'B':[3,np.nan, np.nan],
'C':[4,5,6]})
def impute_missing_values(df):
for column in df:
for idx, value in df[column].iteritems():
if math.isnan(value):
df.loc[idx,column] = df[column].mean(skipna=True)
else:
pass
return df
impute_missing_values(table)
table
输出:
A B C
0 1.0 3.0 4
1 2.0 3.0 5
2 1.5 3.0 6
答案 2 :(得分:0)
您可以使用均值选项尝试从scikit学习(https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html#sklearn.impute.SimpleImputer)的SimpleImputer。
import pandas as pd
from sklearn.impute import SimpleImputer
table = pd.DataFrame({'A':[1,2,np.nan],
'B':[3,np.nan, np.nan],
'C':[4,5,6]})
print(table, '\n')
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
table_means = pd.DataFrame(imp.fit_transform(table), columns = {'C','B','A'})
print(table_means)
打印命令将导致:
A B C
0 1.0 3.0 4
1 2.0 NaN 5
2 NaN NaN 6
A C B
0 1.0 3.0 4.0
1 2.0 3.0 5.0
2 1.5 3.0 6.0
要更正您的代码(根据我在下面的评论):
def impute_missing_values(table):
for column in table:
table.loc[:,column] = np.where(table[column].isna(), table[column].mean(), table[column])
return table