sklearn.impute.SimpleImputer:无法填写数据框列列表的最常见值

问题描述 投票:0回答:1

我有一个数据框的列列表,其中包含 NA(如下)。所有这些列的

dtype
str
.

X_train_objects = ['HomePlanet',
 'Destination',
 'Name',
 'Cabin_letter',
 'Cabin_number',
 'Cabin_letter_2']

我想用

SimpleImputer
来填写NA的意志最常见的价值(模式)。但是,我得到了
ValueError: Columns must be same length as key
。这是什么原因,我的代码对我来说似乎是正确的?

X_train

列的
Dataframe样本(称为
Destination
)是
np.NA
s:

{'PassengerId': {47: '0045_02',
  128: '0138_02',
  139: '0152_01',
  347: '0382_01',
  430: '0462_01'},
 'HomePlanet': {47: 'Mars',
  128: 'Earth',
  139: 'Earth',
  347: nan,
  430: 'Earth'},
 'CryoSleep': {47: 1, 128: 0, 139: 0, 347: 0, 430: 1},
 'Destination': {47: nan, 128: nan, 139: nan, 347: nan, 430: nan},
 'Age': {47: 19.0, 128: 34.0, 139: 41.0, 347: 23.0, 430: 50.0},
 'VIP': {47: 0, 128: 0, 139: 0, 347: 0, 430: 0},
 'RoomService': {47: 0.0, 128: 0.0, 139: 0.0, 347: 348.0, 430: 0.0},
 'FoodCourt': {47: 0.0, 128: 22.0, 139: 0.0, 347: 0.0, 430: 0.0},
 'ShoppingMall': {47: 0.0, 128: 0.0, 139: 0.0, 347: 0.0, 430: 0.0},
 'Spa': {47: 0.0, 128: 564.0, 139: 0.0, 347: 4.0, 430: 0.0},
 'VRDeck': {47: 0.0, 128: 207.0, 139: 607.0, 347: 368.0, 430: 0.0},
 'Name': {47: 'Mass Chmad',
  128: 'Monah Gambs',
  139: 'Andan Estron',
  347: 'Blanie Floydendley',
  430: 'Ronia Sosanturney'},
 'Transported': {47: 1, 128: 0, 139: 0, 347: 0, 430: 0},
 'Cabin_letter': {47: 'F', 128: 'E', 139: 'F', 347: 'G', 430: 'G'},
 'Cabin_number': {47: '10', 128: '5', 139: '32', 347: '64', 430: '67'},
 'Cabin_letter_2': {47: 'P', 128: 'P', 139: 'P', 347: 'P', 430: 'S'}}

我的代码:

imputer = SimpleImputer(missing_values=np.NaN, strategy='most_frequent')
X_train[X_train_objects] = imputer.fit_transform(X_train[X_train_objects].values.reshape(-1,1))[:,0]
python pandas scikit-learn imputation
1个回答
0
投票

这是您问题中的代码的作用:

  • 适用于具有形状 (5, 6)
    X_train[X_train_objects]
  • 将其转换为 numpy 数组(通过
    values
    )并使用
    .reshape(-1,1)[:,0]
  • 将其更改为长度为 30 的一维数组
  • 将其作为参数传递给
    imputer.fit_transform
    ,它返回一个形状与其输入相同的结果
  • 尝试使用这个长度为 30 的一维数组来更新
    X_train[X_train_objects]
    中的所有行(如上所述)具有形状 (5, 6),或者具体来说,只有 6 列

这会导致错误:

ValueError: Columns must be same length as key

我相信你的意图是,在按摩了最初在

X_train[X_train_objects]
中找到的值之后,通过用按摩过的值覆盖原始值来更新原始对象。为此,我认为以下方法应该有效:

X_train[X_train_objects] = (
    imputer.fit_transform(X_train[X_train_objects].values.reshape(-1,1))[:,0]
    .reshape(-1,len(X_train_objects)) )
© www.soinside.com 2019 - 2024. All rights reserved.