在 Dataframe 中的某些列上输入
Imputer on some columns in a Dataframe
我正在尝试在一个名为 age 的列上使用 Imputer 来替换缺失的 values.But 我得到的错误是“预期的二维数组,而不是一维数组:”
以下是我的代码
import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer
dataset = pd.read_csv("titanic_train.csv")
dataset.drop('Cabin',axis = 1,inplace = True)
x = dataset.drop('Survived',axis = 1)
y = dataset['Survived']
imputer = Imputer(missing_values ="nan",strategy = "mean",axis = 1)
imputer=imputer.fit(x['Age'])
x['Age']=imputer.transform(x['Age'])
Imputer 需要一个二维数组作为输入,即使其中一个维度的长度为 1。这可以使用 np.reshape
:
来实现
imputer = Imputer(missing_values='NaN', strategy='mean')
imputer.fit(x['Age'].values.reshape(-1, 1))
x['Age'] = imputer.transform(x['Age'].values.reshape(-1, 1))
就是说,如果您不做任何比用平均值填充缺失值更复杂的事情,您可能会发现完全跳过 Imputer 并只使用 Pandas fillna
更容易:
x['Age'].fillna(x['Age'].mean(), inplace=True)
当你适应变形时使用重塑(-1,1)。因为方法需要一个二维数组作为输入,但你给出的是一维数组。
例如:x['Age']=imputer.transform(x['Age'].reshape(-1,1))
虽然@thesilkworkm 在路边打败了我,但了解您自己的代码为何不起作用可能会很有用。
所以,除了reshape问题,你的代码还有两个错误;第一个是你错误地要求 axis=1
在你的 imputer 中,而你应该要求 axis=0
(这是默认值,这就是为什么它在完全省略时有效,如@thesilkworkm'a answer );来自 docs:
axis : integer, optional (default=0)
The axis along which to impute.
- If axis=0, then impute along columns.
- If axis=1, then impute along rows.
第二个错误是你的missing_values
参数,应该是'NaN'
,而不是'nan'
;再次来自 docs:
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”.
所以,只是为了提供一种替代但等效的解决方案(除了@thesilkworm 已经提供的解决方案),您还可以在一行中进行拟合和转换:
imp = Imputer(missing_values ="NaN",strategy = "mean",axis = 0)
x['Age'] = imp.fit_transform(x['Age'].reshape(-1,1))
我正在尝试在一个名为 age 的列上使用 Imputer 来替换缺失的 values.But 我得到的错误是“预期的二维数组,而不是一维数组:”
以下是我的代码
import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer
dataset = pd.read_csv("titanic_train.csv")
dataset.drop('Cabin',axis = 1,inplace = True)
x = dataset.drop('Survived',axis = 1)
y = dataset['Survived']
imputer = Imputer(missing_values ="nan",strategy = "mean",axis = 1)
imputer=imputer.fit(x['Age'])
x['Age']=imputer.transform(x['Age'])
Imputer 需要一个二维数组作为输入,即使其中一个维度的长度为 1。这可以使用 np.reshape
:
imputer = Imputer(missing_values='NaN', strategy='mean')
imputer.fit(x['Age'].values.reshape(-1, 1))
x['Age'] = imputer.transform(x['Age'].values.reshape(-1, 1))
就是说,如果您不做任何比用平均值填充缺失值更复杂的事情,您可能会发现完全跳过 Imputer 并只使用 Pandas fillna
更容易:
x['Age'].fillna(x['Age'].mean(), inplace=True)
当你适应变形时使用重塑(-1,1)。因为方法需要一个二维数组作为输入,但你给出的是一维数组。
例如:x['Age']=imputer.transform(x['Age'].reshape(-1,1))
虽然@thesilkworkm 在路边打败了我,但了解您自己的代码为何不起作用可能会很有用。
所以,除了reshape问题,你的代码还有两个错误;第一个是你错误地要求 axis=1
在你的 imputer 中,而你应该要求 axis=0
(这是默认值,这就是为什么它在完全省略时有效,如@thesilkworkm'a answer );来自 docs:
axis : integer, optional (default=0)
The axis along which to impute.
- If axis=0, then impute along columns.
- If axis=1, then impute along rows.
第二个错误是你的missing_values
参数,应该是'NaN'
,而不是'nan'
;再次来自 docs:
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”.
所以,只是为了提供一种替代但等效的解决方案(除了@thesilkworm 已经提供的解决方案),您还可以在一行中进行拟合和转换:
imp = Imputer(missing_values ="NaN",strategy = "mean",axis = 0)
x['Age'] = imp.fit_transform(x['Age'].reshape(-1,1))