此刻,我有一个熊猫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
进行了编码(未经修改)。我该如何将这些更改整合到管道中?
答案 0 :(得分: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