在Pandas中的行和列上迭代
我试图为列中的所有NAN值填充列的平均值在Pandas中的行和列上迭代,pandas,Pandas,我试图为列中的所有NAN值填充列的平均值 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 val
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
为什么我会收到此代码的错误 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
A B C
0 1.0 3.0 4
1 2.0 3.0 5
2 1.5 3.0 6
好的,我添加这个作为另一个答案,因为这根本不是我推荐的。使用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
A B C
0 1.0 3.0 4
1 2.0 3.0 5
2 1.5 3.0 6
您可以使用mean选项从scikit learn()尝试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
要更正您的代码(根据我下面的评论):
你是说
“非NaN”
值吗?Nan类似于空白值,不会返回任何平均值。另外,您正在使用'skipna=True'
,这将排除所有NaN值。这就是错误。是的。。非NaN值。。我想用列中非NaN值的平均值填充NaN。@gofvonx,实际上,每平均值列是table.mean()
将返回的值。这是正确的。默认情况下,平均值在熊猫中按列计算,然后熊猫使用索引对齐将平均值放置在正确的列中。是。我们有一个fillna函数。但是我想知道上面代码中的问题是什么?实际上我想了解如何迭代列及其值..谢谢@Jorge。。其实我知道这个方法。我只是想修复我的代码,而不一定是结果本身。实际上,从实现结果的角度来看,还有另一个:来自sklearn.preprocessing import imputter。在这种情况下,您不能将字符串与数字进行比较。当数据类型为数字(float或int)时,NaN基本上是一个数字。您的value=='NaN'语句正在尝试将'number'NaN与字符串'NaN'进行比较。我编辑我的答案以使用函数中的np.where。为什么选择math.isnan?我的意思是:如果value=='NaN',:?我认为value=='NaN'不起作用,因为值是dtype float。然而,也许是错的。