Eu tenho um dataframe de pandas com colunas de tipo misto e gostaria de aplicar o min_max_scaler do sklearn a algumas das colunas. Idealmente, eu gostaria de fazer essas transformações no local, mas ainda não descobri uma maneira de fazer isso. Eu escrevi o seguinte código que funciona:
import pandas as pd
import numpy as np
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()
dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
min_max_scaler = preprocessing.MinMaxScaler()
def scaleColumns(df, cols_to_scale):
for col in cols_to_scale:
df[col] = pd.DataFrame(min_max_scaler.fit_transform(pd.DataFrame(dfTest[col])),columns=[col])
return df
dfTest
A B C
0 14.00 103.02 big
1 90.20 107.26 small
2 90.95 110.35 big
3 96.27 114.23 small
4 91.21 114.68 small
scaled_df = scaleColumns(dfTest,['A','B'])
scaled_df
A B C
0 0.000000 0.000000 big
1 0.926219 0.363636 small
2 0.935335 0.628645 big
3 1.000000 0.961407 small
4 0.938495 1.000000 small
Estou curioso para saber se essa é a maneira preferida / mais eficiente de fazer essa transformação. Existe uma maneira que eu poderia usar df.apply que seria melhor?
Também estou surpreso por não conseguir que o seguinte código funcione:
bad_output = min_max_scaler.fit_transform(dfTest['A'])
Se eu passar um quadro de dados inteiro para o scaler, ele funcionará:
dfTest2 = dfTest.drop('C', axis = 1)
good_output = min_max_scaler.fit_transform(dfTest2)
good_output
Estou confuso por que a passagem de uma série para o scaler falha. No meu código de trabalho completo acima, eu esperava apenas passar uma série para o scaler e depois definir a coluna dataframe = para a série escalada. Eu já vi essa pergunta em alguns outros lugares, mas não encontrei uma boa resposta. Qualquer ajuda para entender o que está acontecendo aqui seria muito apreciada!
bad_output = in_max_scaler.fit_transform(dfTest['A'].values)
também não funcionou. @ Larsmans - Sim, eu tinha pensado em ir por este caminho, parece apenas um aborrecimento. Não sei se é um bug ou não que o Pandas possa transmitir um quadro de dados completo para uma função sklearn, mas não uma série. Meu entendimento de um quadro de dados era que ele era um ditado de série. Lendo o livro "Python para Análise de Dados", ele afirma que o pandas é construído sobre o numpy para facilitar o uso em aplicações centradas no NumPy.
bad_output = min_max_scaler.fit_transform(dfTest['A'].values)
? acessar ovalues
atributo retorna uma matriz numpy; por algum motivo, às vezes a API do scikit learn chama corretamente o método certo que faz com que os pandas retornem uma matriz numpy e outras vezes não.