对数据框中的某些列进行插补
Posted
技术标签:
【中文标题】对数据框中的某些列进行插补【英文标题】:Imputer on some columns in a Dataframe 【发布时间】:2019-02-22 09:15:18 【问题描述】:我正在尝试在名为 age 的单列上使用 Imputer 来替换缺失值。但我收到错误为“预期的 2D 数组,得到 1D 数组:”
以下是我的代码
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'])
【问题讨论】:
【参考方案1】: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)
【讨论】:
谢谢 -fillna
也是一个不错的建议
已解决问题。感谢您的帮助以及替代方法。【参考方案2】:
当您适合对其进行转换时,请使用 reshape(-1,1)。因为方法需要一个 2D 数组作为输入,但您提供的是 1D 数组。
例如:x['Age']=imputer.transform(x['Age'].reshape(-1,1))
【讨论】:
【参考方案3】:虽然@thesilkworkm 在路边击败了我,但了解您自己的代码到底为什么不起作用可能会很有用。
所以,除了重塑问题之外,您的代码中还有两个错误;第一个是您错误地在您的估算器中请求axis=1
,而您应该请求axis=0
(这是默认值,这就是为什么它在完全省略时有效,如@thesilkworkm'a 答案);来自docs:
轴:整数,可选(默认=0)
估算的轴。
如果axis=0,则沿列插补。 如果axis=1,则沿行插补。
第二个错误是你的missing_values
参数,应该是'NaN'
,而不是'nan'
;再次来自docs:
missing_values:整数或“NaN”,可选(默认=“NaN”)
缺失值的占位符。所有出现的缺失值都将被估算。对于编码为 np.nan 的缺失值, 使用字符串值“NaN”。
因此,只是为了提供一种替代但等效的解决方案(除了@thesilkworm 已经提供的解决方案),您还可以在一行中进行拟合和转换:
imp = Imputer(missing_values ="NaN",strategy = "mean",axis = 0)
x['Age'] = imp.fit_transform(x['Age'].reshape(-1,1))
【讨论】:
以上是关于对数据框中的某些列进行插补的主要内容,如果未能解决你的问题,请参考以下文章