对数据框中的某些列进行插补

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))

【讨论】:

以上是关于对数据框中的某些列进行插补的主要内容,如果未能解决你的问题,请参考以下文章

在进行小鼠插补并保存结果后,如何使缺失值保持不变?

Spark基于其他数据框中的列对数据框中的列进行重复数据删除

python中的缺失值插补

根据熊猫数据框中的列标签对数据进行分组

如何根据列的值对熊猫数据框中的列进行分类?

如何同时对熊猫数据框中的列进行排序[重复]