我有以下问题:我有一个熊猫数据帧,其中丢失的值由串标na
。我想在其上运行的Imputer与列均值替换缺失值。按照sklearn文件,该参数missing_values
要帮我这个:
missing_values:整数或“南”,可选的(缺省值=”南”)的缺失值的占位符。 missing_values的所有事件会被计算。对于丢失的编码为np.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呢?
谢谢!
既然你说你要通过列的平均值来代替这些'na'
,我猜非缺失值的确漂浮。问题是,大熊猫无法识别字符串'na'
作为缺失值,因此读取与D型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
是D型object
和col2
是D型float64
的。但是,你怎么拿一把对象的意思呢?
解决的办法是告诉pd.read_csv()
解释字符串'na'
的缺失值:
df = pd.read_csv('test.csv', na_values='na')
所得到的数据帧具有D型float64
的两列,你现在可以使用imputer。
这是我收到的错误
IndexError:在未来,0-d布尔阵列将被解释为有效的布尔值的索引
在我来说,我有问题与“中间”的策略,改变它的意思或most_frequent工作。
第一进口 pandas
然后读取your_file_name.csv
。和 iloc
是定义pandas.DataFrame.iloc并且是用于通过位置定位普尔雷整数基于索引。这里格式是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
后这里=
“丢失的数据,你要替换值”,strategy ="mean"
(两个策略是有其遵循即中间和最经常发生在你的数据集,但默认情况下平均值。然后设置轴=(0列和1列),其他的副本,并详细),你可以阅读更多关于它的
from sklearn.preprocessing import Imputer
i = Imputer(missing_values="NaN", strategy="mean", axis=0)
数据融入你的定义Imputer的方式,然后使用变换方法改变它。这将返回数据类型=物体的阵列
i = i.fit(X[a:b, c:d])
X[a:b, c:d ] = i.transform(X[a:b,c:d])
记住这里所选列显示只包含浮动或整数类型的值,否则这可能会显示错误不能字符串转换为浮动
还有,你需要在这里要注意几件事。
确保你是不是归咎于上键入“对象”或分类变量,你可以对你的数据是这样看:
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
现在,这是所有好,很好,但不能在范畴进行(Object类型/串)
来处理它的方法之一,是改变类别特征为数字,是这样的:
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
和Info
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