Сквозная передача ColumnTransformer не работает

#python #pandas #dataframe #scikit-learn #data-science

#python #панды #фрейм данных #scikit-learn #наука о данных

Вопрос:

Я хотел стандартизировать значения в моем фрейме данных pandas и сохранить один столбец значений одинаковым, поэтому я использовал ColumnTransformer . Однако, похоже, что функция не проходит через столбец, который я хочу, чтобы он прошел. df это мой фрейм данных, вот код:

 import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler

physical_vars = ["DPhill", "DYjj", "mjj", "mll", "mT", "ptTot", "sumOfCentralitiesL", "mL1J1", "mL1J2", "mL2J1", "mL2J2", "ptJ1", "ptJ2", "ptJ3", "METSig"]
other_vars = ["eventNumber", "weight"]
full_var_list =  other_vars   physical_vars

ct = ColumnTransformer([('Standardizer', StandardScaler(), full_var_list)],'passthrough')

col_names=full_var_list
col_names.append("ProcessID")
tmp_df=df[col_names]
standardized_values=ct.fit_transform(tmp_df) #np_array

df=pd.DataFrame(standardized_values,columns=full_var_list)
  

Я хочу передать столбец «ProcessId», но когда я распечатываю этот столбец, значения стандартизированы.

Ответ №1:

Это происходит потому, что вы сначала модифицируете список столбцов, а затем применяете преобразователь столбцов. Вы можете проверить

 test = ['column1', 'column2']
col_names = test
col_names.append('column3')
test
  

Вы можете видеть, что test он также содержит ‘column3’. Вы должны создать копию начального списка, а затем изменить эту копию:

 test = ['column1', 'column2']
col_names = test.copy()
col_names.append('column3')
test
  

Теперь test не содержит ‘column3’ и ColumnTransformer будет работать, как ожидалось.