【问题标题】:Iterating over rows and columns in Pandas遍历 Pandas 中的行和列
【发布时间】:2019-05-28 12:23:36
【问题描述】:

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

为什么我收到此代码的错误?

【问题讨论】:

  • 您的意思是'non-NaN' 值吗? Nan 类似于空白值,不会返回任何平均值。另外,您正在使用 'skipna=True' ,它将排除所有 NaN 值。因此出现错误。
  • 是.. 非 NaN 值.. 我想用列中非 NaN 值的平均值填充 NaN。

标签: pandas


【解决方案1】:

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

【讨论】:

  • @gofvonx 实际上,平均列是table.mean() 将返回的内容。这是正确的。
  • 默认情况下均值在 pandas 中按列计算,然后 pandas 使用索引对齐将均值放置在正确的列中。
  • 是的。我们有一个 fillna 函数。但是我想了解上面代码中的问题是什么?
  • 其实我想了解如何迭代列及其值..
【解决方案2】:

好的,我将其添加为另一个答案,因为这根本不是我推荐的。使用 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

【讨论】:

  • 你为什么选择 math.isnan ?我的意思是有什么问题:if value == 'NaN': ??
  • 我不认为 value == 'NaN' 会起作用,因为 value 是 dtype float。但是,可能是错误的。
【解决方案3】:

您可以使用 mean 选项尝试来自 scikit learn (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

【讨论】:

  • 谢谢@Jorge.. 其实我知道这种方法。只是我正在寻找修复我的代码而不一定是结果本身。
  • 其实从实现结果的角度来看——还有一个:from sklearn.preprocessing import Imputer。
  • 在这种情况下,您不能将字符串与数字进行比较。当数据类型为数字(float 或 int)时,NaN 基本上是一个数字。您的 value=='NaN' 语句正在尝试将 'number' NaN 与字符串 'NaN' 进行比较。我编辑我的答案以在您的函数中使用 np.where。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2017-06-02
  • 1970-01-01
  • 2015-08-09
  • 2021-07-05
  • 2016-12-08
  • 2018-10-20
相关资源
最近更新 更多