6

我有以下问题:我有一个 pandas 数据框,其中缺失值由 string 标记na。我想在它上面运行一个 Imputer 来用列中的平均值替换缺失的值。根据 sklearn 文档,该参数missing_values应该可以帮助我:

missing_values:整数或“NaN”,可选(默认=“NaN”)缺失值的占位符。所有出现的缺失值都将被估算。对于编码为 np.nan 的缺失值,请使用字符串值“NaN”。

在我的理解中,这意味着,如果我写

df = pd.read_csv(filename)
imp = Imputer(missing_values='na')
imp.fit_transform(df)

这意味着 imputer 用na列的平均值替换数据框中的任何内容。但是,相反,我收到一个错误:

ValueError: could not convert string to float: na

我在误解什么?这不是 imputer 应该如何工作的吗?那么,我怎样才能na用平均值替换字符串呢?我应该只使用 lambda 吗?

谢谢!

4

4 回答 4

4

既然你说你想用'na'列的平均值替换这些,我猜非缺失值确实是浮点数。问题是 pandas 不会将该字符串识别'na'为缺失值,因此使用 dtypeobject而不是某种风格的float.

举个例子,考虑以下.csv文件:

 test.csv

 col1,col2
 1.0,1.0
 2.0,2.0
 3.0,3.0
 na,4.0
 5.0,5.0

使用 naive import df = pd.read_csv('test.csv')df.dtypes告诉我们 that col1is of dtypeobject并且col2is of dtype float64。但是你如何取一堆物体的平均值呢?

解决方案是告诉pd.read_csv()将字符串解释'na'为缺失值:

df = pd.read_csv('test.csv', na_values='na')

生成的数据框有两列 dtype float64,您现在可以使用您的 imputer。

于 2016-07-01T17:58:25.917 回答
0

这是我收到的错误

IndexError:将来,0-d 布尔数组将被解释为有效的布尔索引

就我而言,我遇到了“中值”策略的问题,将其更改为 mean 或 most_frequent 有效。

于 2017-02-10T12:12:31.940 回答
0

首先导入 pandas 然后阅读 your_file_name.csv . 并且 iloc 被定义为 pandas.DataFrame.iloc 并且是基于 purley 整数的索引,用于按位置进行定位。这里的格式是 iloc[for row index , for column index]a,b,c,d 是整数 a,b,c ,d 也可以为空

import pandas as pd
dataSet = pd.read_csv('your_file_name.csv')
X = dataSet.iloc[ a:b , c:d].values

如果您在没有 .values 的情况下使用,那么您将无法
在导入后将 其用于 imputer 进行转换 Imputer 定义您的Imputer 参数 missing_values =
“您要替换的数据中的缺失值”,strategy ="mean" (还有另外两种策略,即中位数并且最常出现在您的数据集中,但默认值是平均值。然后设置轴 =(0 表示列,1 表示行),其他是复制和详细)你可以阅读更多关于它的信息

from sklearn.preprocessing import Imputer
i = Imputer(missing_values="NaN", strategy="mean", axis=0) 

将数据拟合到您定义的 Imputer 方式中,然后使用 transform 方法对其进行转换。这将返回 datatype = object 的数组

i  = i.fit(X[a:b, c:d])
X[a:b, c:d ] = i.transform(X[a:b,c:d])

请记住,您选择的列显示仅包含浮点或整数类型值,否则这可能会显示错误无法将字符串转换为浮点

于 2018-06-26T02:47:53.947 回答
0

这里有几件事情你需要注意。

确保您没有在类型“对象”或分类变量上进行估算,您可以像这样查看您的数据:

df = pd.read_csv(filename)

print(df.info(null_counts=True))

最后一列应该是类型

让我们看一个例子:

df = pd.DataFrame({'A' : [1, 2, 2, 2, 'NaN', 3, 4, 5, 6], 'B' : [3, 3, 'NaN', 3, 3, 4, 3, 3, 3]})

输出:

df.head()


    A   B
---------
0   1   3
1   2   3
2   2   NaN
3   2   3
4   NaN 3

现在让我们看看类型

df.info(null_counts=True)

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 2 columns):
0    9 non-null float64
1    9 non-null float64
dtypes: float64(2)
memory usage: 224.0 bytes

现在估算:

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
df_imputed = pd.DataFrame(imputer.fit_transform(df))
df_imputed.head()


    0   1
-----------
0   1.0 3.0
1   2.0 3.0
2   2.0 3.0
3   2.0 3.0
4   2.0 3.0

现在这一切都很好,但不能在分类上完成(类型对象/字符串)

处理它的一种方法是将分类特征更改为数字,如下所示:

df_with_cat = pd.DataFrame({'A': ['ios', 'android', 'web', 'NaN'], 'B' : [4, 4, 'NaN', 2]})
df_with_cat.head()


      A     B
-------------
0   ios     4
1   android 4
2   web     NaN
3   NaN     2

和信息

df_with_cat.info(null_counts=True)

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
A    4 non-null object
B    4 non-null object
dtypes: object(2)
memory usage: 144.0+ bytes

我们肯定知道 B 是数字,所以让我们这样做:

df_with_cat['B'] = df_with_cat['B'].astype(np.float)
df_with_cat.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
A    4 non-null object
B    3 non-null float64
dtypes: float64(1), object(1)
memory usage: 144.0+ bytes

如果我们使用上面相同的 imputer,我们会得到一个错误(你可以试试)

现在让我们将“A”类别转换为数字:

CATEGORICAL_FEATURES = [
    'A', 
]
data_dum = pd.get_dummies(df_with_cat, columns=['A'], drop_first=True)
data_dum.head()

    B   A_android   A_ios   A_web
---------------------------------
0   4       0         1       0
1   4       1         0       0
2   NaN     0         0       1
3   2       0         0       0

现在我们可以在我们的数据框上从上面运行相同的 Imputer

于 2019-02-05T16:32:00.483 回答