此刻,我有一个熊猫df x
。 x
有一个字符串列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
进行了编码(未进行任何修改)。如何将这些更改整合到管道中?
如果数据在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