Python 使用标签将列传递给插补器的正确方法?

Python 使用标签将列传递给插补器的正确方法?,python,dataframe,machine-learning,scikit-learn,Python,Dataframe,Machine Learning,Scikit Learn,我有以下工作代码: imputer = Imputer(missing_values = 'NaN', strategy='mean', axis = 0) imputer = imputer.fit(X_train[['Age']]) X_train['Age'] = imputer.transform(X_train[['Age']]) 这给了我以下警告: 试图在数据帧切片的副本上设置值。尝试 改为使用.loc[row\u indexer,col\u indexer]=值 当我使用下面这句

我有以下工作代码:

imputer = Imputer(missing_values = 'NaN', strategy='mean', axis = 0)
imputer = imputer.fit(X_train[['Age']])
X_train['Age'] = imputer.transform(X_train[['Age']])
这给了我以下警告:

试图在数据帧切片的副本上设置值。尝试 改为使用.loc[row\u indexer,col\u indexer]=值

当我使用下面这句话时,我仍然得到同样的警告;为什么会这样

X_train['Age'] = imputer.transform(X_train[['Age']])
如果我尝试将相同的逻辑应用于所有事物:

imputer = Imputer(missing_values = 'NaN', strategy='mean', axis = 0)
imputer = imputer.fit(X_train.loc[:,'Age'])
X_train.loc[:,'Age'] = imputer.transform(X_train.loc[:, 'Age'])
我收到以下消息,
输入器不工作:

使用数组重塑数据。如果数据具有 单个特征或阵列。如果包含单个样本,则重塑(1,-1)

请问,谁能解释一下,使用标签将列传递给输入者的正确方法是什么


我不清楚使用
[['Age']]
.loc[:,'Age']
之间的区别,看起来它们有相同的数据,但形状不同。

根据您收到的上一个错误,当您选择一个数据帧列,如
inputer=inputer.fit(X_train.loc[:,'Age'])
实际上,您将一个序列传递给插补器,这是一维的

类型(X_列车['Age'])
熊猫。核心。系列。系列
但是,方法
fit()
希望您向它传递一个二维数组。相反,您可以以返回数据帧(即二维)的方式使用列年龄索引:

类型(X_train.iloc[:,2:3])
pandas.core.frame.DataFrame

这样做,您将不会收到标注错误。我为您的目的测试了它,它成功了。

使用拟合变换方法

imputer = Imputer(missing_values=0, strategy="mean", axis=0)
X_train[['Age']] = imputer.fit_transform(X_train[['Age']])

我推荐以下方法

X.loc[:,'Age'] = imputer.fit_transform(X[['Age']])
工作示例:

import pandas as  pd
import numpy as np
from sklearn.impute import SimpleImputer

X = pd.DataFrame({'Age': [12,13,'NaN', 23,31,12,43,32,42,]})
imputer = SimpleImputer(strategy='mean')
X.loc[:,'Age'] = imputer.fit_transform(X[['Age']])

#
    Age
0   12.0
1   13.0
2   26.0
3   23.0
4   31.0
5   12.0
6   43.0
7   32.0
8   42.0

inputer
期望2D{类似数组、稀疏矩阵}、形状(n_样本、n_特征)或数据帧。当您仅使用
X['Age']
时,它将返回一个pd.Series对象。相反,当您使用
X[['Age']]
时,将返回数据帧