Python - SkLearn Impute 用法
Python - SkLearn Imputer usage
我有以下问题:我有一个 pandas 数据框,其中缺失值由字符串 na
标记。我想 运行 一个 Imputer 来用列中的平均值替换缺失值。根据 sklearn 文档,参数 missing_values
应该可以帮助我:
missing_values : integer or “NaN”, optional (default=”NaN”) The
placeholder for the missing values. All occurrences of missing_values
will be imputed. For missing values encoded as np.nan, use the string
value “NaN”.
以我的理解,这意味着,如果我写
df = pd.read_csv(filename)
imp = Imputer(missing_values='na')
imp.fit_transform(df)
这意味着输入器用列的平均值替换数据框中具有 na
值的任何内容。但是,相反,我得到一个错误:
ValueError: could not convert string to float: na
我误解了什么?这不是 imputer 应该如何工作的吗?那么,如何用平均值替换 na
字符串呢?我应该只使用 lambda 吗?
谢谢!
既然你说你想用列的平均值替换这些 'na'
,我猜非缺失值确实是浮点数。问题是 pandas 无法将字符串 'na'
识别为缺失值,因此读取数据类型为 object
的列,而不是 float
.[=26 的某种风格=]
例如,考虑以下 .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 object
而 col2
是 dtype float64
.但是如何取一堆对象的平均值呢?
解决方案是告诉pd.read_csv()
将字符串'na'
解释为缺失值:
df = pd.read_csv('test.csv', na_values='na')
生成的数据框包含两列 dtype float64
,您现在可以使用输入器了。
这是我收到的错误
IndexError: in the future, 0-d boolean arrays will be interpreted as a valid boolean index
就我而言,我对 "median" 策略有疑问,将其更改为均值或 most_frequent 有效。
首先导入 pandas
然后读取your_file_name.csv
。并且 iloc
被定义为 pandas.DataFrame.iloc 并且是基于 purley 整数的 location by position 索引。这里的格式是 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
定义你的 Imputer
参数 missing_values
=
"missing values in data that you want to replace " ,strategy ="mean"
(还有两个
那里有它遵循的策略,即中位数和最常出现的策略
你的数据集,但默认是 mean 。然后设置 axis = (0 for column and 1 for row ) , other are copy and verbose ) you can read more about it on
from sklearn.preprocessing import Imputer
i = Imputer(missing_values="NaN", strategy="mean", axis=0)
将数据放入您定义的 Imputer 方式中,然后使用 transform 方法对其进行转换。这将 return array of datatype = object
i = i.fit(X[a:b, c:d])
X[a:b, c:d ] = i.transform(X[a:b,c:d])
请记住,此处显示的所选列仅包含浮点数或整数类型值,否则可能会显示错误无法将字符串转换为浮点数
这里有几点需要注意。
确保您没有对类型 "object" 或分类变量进行估算,您可以这样查看您的数据:
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
我有以下问题:我有一个 pandas 数据框,其中缺失值由字符串 na
标记。我想 运行 一个 Imputer 来用列中的平均值替换缺失值。根据 sklearn 文档,参数 missing_values
应该可以帮助我:
missing_values : integer or “NaN”, optional (default=”NaN”) The placeholder for the missing values. All occurrences of missing_values will be imputed. For missing values encoded as np.nan, use the string value “NaN”.
以我的理解,这意味着,如果我写
df = pd.read_csv(filename)
imp = Imputer(missing_values='na')
imp.fit_transform(df)
这意味着输入器用列的平均值替换数据框中具有 na
值的任何内容。但是,相反,我得到一个错误:
ValueError: could not convert string to float: na
我误解了什么?这不是 imputer 应该如何工作的吗?那么,如何用平均值替换 na
字符串呢?我应该只使用 lambda 吗?
谢谢!
既然你说你想用列的平均值替换这些 'na'
,我猜非缺失值确实是浮点数。问题是 pandas 无法将字符串 'na'
识别为缺失值,因此读取数据类型为 object
的列,而不是 float
.[=26 的某种风格=]
例如,考虑以下 .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 object
而 col2
是 dtype float64
.但是如何取一堆对象的平均值呢?
解决方案是告诉pd.read_csv()
将字符串'na'
解释为缺失值:
df = pd.read_csv('test.csv', na_values='na')
生成的数据框包含两列 dtype float64
,您现在可以使用输入器了。
这是我收到的错误
IndexError: in the future, 0-d boolean arrays will be interpreted as a valid boolean index
就我而言,我对 "median" 策略有疑问,将其更改为均值或 most_frequent 有效。
首先导入 pandas
然后读取your_file_name.csv
。并且 iloc
被定义为 pandas.DataFrame.iloc 并且是基于 purley 整数的 location by position 索引。这里的格式是 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
定义你的 Imputer
参数 missing_values
=
"missing values in data that you want to replace " ,strategy ="mean"
(还有两个
那里有它遵循的策略,即中位数和最常出现的策略
你的数据集,但默认是 mean 。然后设置 axis = (0 for column and 1 for row ) , other are copy and verbose ) you can read more about it on
from sklearn.preprocessing import Imputer
i = Imputer(missing_values="NaN", strategy="mean", axis=0)
将数据放入您定义的 Imputer 方式中,然后使用 transform 方法对其进行转换。这将 return array of datatype = object
i = i.fit(X[a:b, c:d])
X[a:b, c:d ] = i.transform(X[a:b,c:d])
请记住,此处显示的所选列仅包含浮点数或整数类型值,否则可能会显示错误无法将字符串转换为浮点数
这里有几点需要注意。
确保您没有对类型 "object" 或分类变量进行估算,您可以这样查看您的数据:
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