遍历Pandas中的行和列

时间:2019-01-01 14:53:41

标签: pandas

我正在尝试为列中的所有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

为什么我的代码出现错误?

3 个答案:

答案 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