Я хочу предварительно обработать DataFrame с помощью sklearn's Pipeline и ColumnTransformer. Мой конвейер состоит из FunctionTransformer, за которым следует ColumnTransformer, а затем другой FunctionTransformer.
У меня есть следующий DataFrame (показанный в формате dict) с различными типами столбцов:
{'A': {0: 1787, 1: 5745, 2: 25, 3: 254, 4: 4545},
'B': {0: 9.0, 1: 16.0, 2: 50.0, 3: 14.5, 4: 50.0},
'E': {0: 'Audio', 1: 'Text', 2: 'Text', 3: 'Audio', 4: 'Text'},
'F': {0: np.nan, 1: np.nan, 2: np.nan, 3: 1.0, 4: np.nan}}
И это мой pipe:
pipeline = Pipeline(([
('count_transform', FunctionTransformer(count_volume)),
('union', ColumnTransformer(
[('binning', KBinsDiscretizer(n_bins=3, encode='ordinal'),
['B']),
('transform_type', FunctionTransformer(transform_type)),
['C', 'D']),
], remainder="passthrough"),
('another_transform', FunctionTransformer(another_transform))
]))
Проблема заключается в том, что из-за функции FunctionTransformer, возвращающей массив NumPy, имена столбцов информационного кадра удаляются, поэтому ColumnTransformer не может найти столбцы.
Я подумал о следующих решениях :
- Создание собственного Transformer и возврат df: мне нужно создать много классов только для разных имеющихся у меня трансформаторов. Кроме того, методы будут иметь статус c, так как они не используют никаких свойств класса.
- Указание столбцов по индексу: это может быть очень запутанным и приводить к ошибкам при кодировании, поскольку преобразователи иногда меняют порядок столбцов.
Есть идеи о том, что делать?