使用OneHotEncoder()有什么更好的方法?

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

此刻,我有一个熊猫df xx有一个字符串列Name,我希望在Scikit-Learn管道中使用OneHotEncoder()。但是,我首先要操纵Name列(格式,剥离和调整),并且我认为可以为此构建自己的转换器。看起来像这样:

class NameModifier(BaseEstimator, TransformerMixin):
   def __init__(self):
      pass
   def fit(self, X, y=None):
      return self
   def transform(self, X, y=None):
      new_name_df = modifyAndReturnNewDataFrame(X)
      return new_name_df

然后我有了这个管道:

my_pipeline = ColumnTransformer([
   ("modify_name", NameModifier(), ["Name"]),
   ("encode_name", OneHotEncoder(), ["Name"])
])

# get prepared data
prepared_data = my_pipeline.fit_transform(x)

这不符合我的预期;看起来我的管道首先格式化了名称,但OneHotEncoder()并未真正对修改后的Name列进行编码,而是对原始的Name进行了编码(未进行任何修改)。如何将这些更改整合到管道中?

python pandas scikit-learn
1个回答
0
投票

如果数据在Pandas DataFrame中,则在通过管道运行数据之前,我会使用apply

import pandas as pd

data = [['Name_1 Space  ', 123], ['Name_2 Space  ', 456]]

df = pd.DataFrame(data, columns=['Names', 'Numerics'])
df['Names'] = df.Names.apply(lambda col: col.strip().replace(' Space', '').upper())

print(df)

        Names  Numerics
0  pre NAME_1       123
1  pre NAME_2       456
© www.soinside.com 2019 - 2024. All rights reserved.