Eu tenho um quadro de dados em pandas onde cada coluna tem um intervalo de valores diferente. Por exemplo:
df:
A B C
1000 10 0.5
765 5 0.35
800 7 0.09
Alguma idéia de como posso normalizar as colunas desse quadro de dados em que cada valor está entre 0 e 1?
Minha saída desejada é:
A B C
1 1 1
0.765 0.5 0.7
0.8 0.7 0.18(which is 0.09/0.5)
ddof
argumento?Respostas:
Você pode usar o pacote sklearn e seus utilitários de pré-processamento associados para normalizar os dados.
Para mais informações olhada no scikit-learn documentação sobre o pré-processamento de dados: escala apresenta para um intervalo.
fonte
pd.DataFrame(min_max_scaler.fit_transform(df.T), columns=df.columns, index=df.index)
df=pandas.DataFrame(x_scaled, columns=df.columns)
Uma maneira fácil de usar o Pandas : (aqui eu quero usar a normalização média)
para usar a normalização min-max:
Editar: Para resolver algumas preocupações, é preciso dizer que o Pandas aplica automaticamente a função de cores no código acima.
fonte
Com base nesta postagem: /stats/70801/how-to-normalize-data-to-0-1-range
Você pode fazer o seguinte:
Você não precisa se preocupar se seus valores são negativos ou positivos. E os valores devem ser bem distribuídos entre 0 e 1.
fonte
Seu problema é realmente uma transformação simples que atua nas colunas:
Ou ainda mais conciso:
fonte
lambda
primeiro é o melhor :-)axis [...] 0 or 'index': apply function to each column
. O padrão é, na verdade,axis=0
para que essa linha única possa ser escrita ainda mais curta :-) Obrigado @tschm.Se você gosta de usar o pacote sklearn, pode manter os nomes de colunas e índices usando pandas da seguinte
loc
maneira:fonte
Simples é bonito:
fonte
df["A"] = (df["A"]-df["A"].min()) / (df["A"].max()-df["A"].min())
df /= df.max()
- supondo que o objetivo seja normalizar cada coluna individualmente.Você pode criar uma lista de colunas que deseja normalizar
Seu Dataframe do Pandas agora está normalizado apenas nas colunas que você deseja
No entanto , se você desejar o contrário , selecione uma lista de colunas que NÃO deseja normalizar, basta criar uma lista de todas as colunas e remover as que não são desejadas.
fonte
Eu acho que a melhor maneira de fazer isso nos pandas é apenas
Editar Se houver números negativos no seu quadro de dados, você deve usar
fonte
A solução dada por Sandman e Praveen está muito bem. O único problema é que, se você tiver variáveis categóricas em outras colunas do seu quadro de dados, esse método precisará de alguns ajustes.
Minha solução para esse tipo de problema é a seguinte:
fonte
Exemplo de diferentes padronizações em python.
Para referência, consulte este artigo da wikipedia: https://en.wikipedia.org/wiki/Unbeased_estimation_of_standard_deviation
Dados de exemplo
Normalização usando pandas (fornece estimativas imparciais)
Ao normalizar, subtraímos a média e dividimos pelo desvio padrão.
Normalização usando o sklearn (fornece estimativas tendenciosas, diferentes dos pandas)
Se você fizer a mesma coisa
sklearn
, obterá DIFERENTES resultados!As estimativas tendenciosas do sklearn tornam o aprendizado de máquina menos poderoso?
NÃO.
A documentação oficial do sklearn.preprocessing.scale afirma que o uso do estimador enviesado NÃO É PROVÁVEL para afetar o desempenho dos algoritmos de aprendizado de máquina e podemos usá-los com segurança.
E o MinMax Scaling?
Não há cálculo de desvio padrão na escala MinMax. Portanto, o resultado é o mesmo nos pandas e no scikit-learn.
fonte
Você pode querer que algumas das colunas sejam normalizadas e as outras permaneçam inalteradas, como algumas das tarefas de regressão, cujos rótulos de dados ou colunas categóricas permanecem inalteradas. Por isso, sugiro que você use este método python (é uma combinação das respostas @shg e @Cina):
fonte
É apenas matemática simples. A resposta deve ser tão simples quanto abaixo.
fonte
No documento dos pandas, a estrutura DataFrame pode aplicar uma operação (função) a si mesma.
Você pode aplicar uma função personalizada para operar o DataFrame.
fonte
A seguinte função calcula a pontuação Z:
fonte
É assim que você faz colunas usando a compreensão da lista:
fonte
Você pode simplesmente usar a função pandas.DataFrame.transform 1 desta maneira:
fonte
fonte
Você pode fazer isso em uma linha
leva média para cada coluna e subtrai-a (média) de cada linha (média de uma coluna específica subtrai apenas sua linha) e divide-a apenas por média. Finalmente, o que obtemos é o conjunto de dados normalizados.
fonte
O Pandas faz a normalização de colunas por padrão. Experimente o código abaixo.
Os valores de saída estarão na faixa de 0 e 1.
fonte