Python - SkLearn Imputer用法

时间:2016-07-01 16:42:19

标签: python scikit-learn imputation

我有以下问题:我有一个pandas数据帧,其中缺失值由字符串None标记。我想在它上面运行一个Imputer,用列中的平均值替换缺少的值。根据sklearn文档,参数{ xtype: 'panel', title: "Search Result", height:500, items: [{ xtype : 'GridPanel', store: new Ext.data.ArrayStore({ fields : this.fields }), flex: 1, columns: this.columns, stripeRows: true, id: 'RID', autoHeight: true, //sm: new Ext.grid.Checkbo;xSelectionModel({singleSelect:true}), frame: true, listeners { afterRenderer : function(){ Ext.Ajax.request({ url: 'XML/1Cohart.xml', scope: this, timeout: global_constants.TIMEOUT, method: "GET", disableCaching: true, failure: function(response) { utils.showOKErrorMsg(sdisMsg.ajaxRequestFailed); }, success: function(response) { debugger; var datas = response.responseXML; Ext.each(datas.getElementsByTagName("HEADER"), function(header) { this.buildField(header); this.buildColumn(header); }, this); Ext.each(datas.getElementsByTagName("G"), function (columnData) { //debugger; //this.buildData(columnData); this.fieldLength = this.fields.length; this.record = []; for (i = 0; i < this.fieldLength; i++) { //debugger; var fieldName = this.fields[i].name this.record[i] = columnData.getAttribute(fieldName); } this.data.push(this.record); }, this); }); } }) } } ] } 应该可以帮助我:

  

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

根据我的理解,这意味着,如果我写

na

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

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

我误解了什么?这不是影像应该如何工作的吗?那么如何用平均值替换na字符串呢?我应该只使用lambda吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

由于您说要将这些'na'替换为列的平均值,因此我猜测非缺失值确实是浮点数。问题是pandas无法将字符串'na'识别为缺失值,因此使用dtype object而不是某种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

使用天真导入df = pd.read_csv('test.csv')df.dtypes告诉我们col1是dtype objectcol2是dtype float64。但是你如何看待一堆物体的意思呢?

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

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

生成的数据框包含两列dtype float64,您现在可以使用您的影片了。

答案 1 :(得分:0)

以下是我收到的错误

  

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

在我的情况下,我遇到了&#34;中位数&#34;战略,将其改为平均或最常见的工作。

答案 2 :(得分:0)

首先导入 pandas ,然后阅读your_file_name.csv iloc 定义为pandas.DataFrame.iloc,并且是基于purley整数的按位置索引的位置。格式为iloc[for row index , for column index],其中a,b,c,d是整数ab,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参数missing_values =
“,您要替换的数据中缺少值”,strategy ="mean" (还有两个 有遵循的策略,即中位数,最常发生在 您的dataSet,但默认值为mean。然后设置axis =(0代表列,1代表行),其他分别是复制和冗长),您可以在

上阅读有关它的更多信息。
from sklearn.preprocessing import Imputer
i = Imputer(missing_values="NaN", strategy="mean", axis=0) 

使数据适合您定义的Imputer方式,然后使用transform方法对其进行转换。这将返回数据类型=对象的数组

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

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

答案 3 :(得分: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

如果我们从上方使用相同的推动器,则会收到错误消息(您可以尝试一下)

现在让我们将“ 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