在Pandas中的行和列上迭代

在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

我试图为列中的所有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 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。然而,也许是错的。