HOWTO · Pandas

Três maneiras de normalizar colunas numéricas de DataFrame no Pandas

Compare a padronização pela média (escore z), o escalonamento min-max e a normalização por quantis para colunas numéricas de DataFrame do Pandas, com fórmulas e exemplos reutilizáveis.

Nesta página

Para reescalar colunas numéricas em um DataFrame do Pandas, há três abordagens: a normalização pela média (padronização z-score) centraliza cada coluna e a divide pelo desvio padrão; a escala min-max mapeia cada coluna não constante para 0–1; e a normalização por quantis mapeia os valores por posição no ranking em direção a uma distribuição compartilhada. A escolha depende da escala necessária para o modelo, da sensibilidade a valores discrepantes e de ser ou não desejável que as colunas tenham distribuições comparáveis.

Normalização de dados no Pandas

A normalização reescala valores, enquanto a padronização os centraliza em torno da média e os expressa em unidades de desvio padrão. Este guia apresenta três transformações aplicadas coluna a coluna. O Pandas não oferece um único método dedicado de DataFrame para essas fórmulas, mas suas operações aritméticas e de classificação permitem implementá-las com facilidade.

Os exemplos usam o mesmo DataFrame pequeno e determinístico, com quatro colunas numéricas. Cada transformação é aplicada ao longo de cada coluna, que mantém seu nome e seus índices de linha.

import pandas as pd


df = pd.DataFrame({
    "A": [1, 2, 3, 4],
    "B": [10, 20, 30, 40],
    "C": [4, 1, 3, 2],
    "D": [5, 5, 5, 5],
})

print(df)
   A   B  C  D
0  1  10  4  5
1  2  20  1  5
2  3  30  3  5
3  4  40  2  5

A coluna D é constante para deixar explícito seu comportamento na seção sobre min-max. Os exemplos a seguir são independentes e recriam essa mesma entrada.

Normalize um DataFrame do Pandas pela mean

A fórmula baseada na média é (x - mean) / standard deviation, calculada separadamente para cada coluna. Trata-se da padronização z-score: cada coluna transformada fica com média próxima de zero, e os valores são expressos em unidades de desvio padrão, sem ficar limitados a 0–1. Por padrão, Series.std() do Pandas usa o desvio padrão amostral (ddof=1); use ddof=0 quando o cálculo exigir o desvio padrão populacional.

import pandas as pd


df = pd.DataFrame({
    "A": [1, 2, 3, 4],
    "B": [10, 20, 30, 40],
    "C": [4, 1, 3, 2],
    "D": [5, 5, 5, 5],
})

mean_norm = df.apply(lambda column: (column - column.mean()) / column.std(), axis=0)
print(mean_norm.round(3))
       A      B      C   D
0 -1.162 -1.162  1.162 NaN
1 -0.387 -0.387 -1.162 NaN
2  0.387  0.387  0.387 NaN
3  1.162  1.162 -0.387 NaN

Essa transformação é útil quando um método se beneficia de escalas centralizadas e comparáveis. Uma coluna constante tem desvio padrão igual a zero, então a fórmula produz valores ausentes para essa coluna. Decida se deve remover esse recurso ou tratá-lo separadamente, de acordo com a aplicação.

Normalize um DataFrame do Pandas com min-max

Para cada coluna, a escala min-max usa (x - min) / (max - min). O mínimo e o máximo de cada coluna não constante passam a ser 0 e 1, e os demais valores ficam proporcionalmente entre eles. A função auxiliar abaixo usa o argumento df_input em toda a implementação e mapeia uma coluna constante para 0, uma escolha neutra comum quando o recurso não apresenta variação.

import pandas as pd


def minmax_norm(df_input):
    column_range = df_input.max() - df_input.min()
    scaled = (df_input - df_input.min()) / column_range
    return scaled.fillna(0)


df = pd.DataFrame({
    "A": [1, 2, 3, 4],
    "B": [10, 20, 30, 40],
    "C": [4, 1, 3, 2],
    "D": [5, 5, 5, 5],
})

print(minmax_norm(df).round(3))
       A      B      C    D
0  0.000  0.000  1.000  0.0
1  0.333  0.333  0.000  0.0
2  0.667  0.667  0.667  0.0
3  1.000  1.000  0.333  0.0

A escala min-max é adequada quando um intervalo fixo é importante. Como a escala é definida pelo mínimo e pelo máximo observados, um valor extremo pode comprimir os demais valores da coluna em um intervalo estreito. O fillna(0) ao final da função mapeia colunas numéricas constantes para 0, mas também substitui por 0 todos os valores ausentes que já estavam na entrada. Se preferir imputar pela média, preencha os valores ausentes antes de chamar a função, por exemplo, com minmax_norm(df_input.fillna(df_input.mean())); escolha uma política de imputação adequada aos seus dados.

Normalize um DataFrame do Pandas com quantile

A normalização por quantis é útil quando se espera que as colunas tenham a mesma distribuição subjacente. Ela ordena cada coluna, calcula a média dos valores ordenados em cada posição entre as colunas e, em seguida, associa essas médias às linhas originais conforme suas posições. Diferentemente dos outros dois métodos, ela altera os valores para alinhar as distribuições empíricas das colunas; use-a somente quando a hipótese de uma distribuição compartilhada for adequada.

Esta implementação usa rank(method="min"): valores empatados recebem a menor posição do grupo. As posições empatadas não são calculadas pela média, portanto os empates podem fazer com que as distribuições resultantes sejam diferentes. No exemplo compartilhado, a coluna D é constante: os quatro valores empatam na menor posição e, por isso, são mapeados para a mesma média daquela posição, em vez de percorrerem as posições da distribuição compartilhada.

import numpy as np
import pandas as pd


def quantile_norm(df_input):
    sorted_values = np.sort(df_input.to_numpy(), axis=0)
    rank_means = sorted_values.mean(axis=1)
    rank_to_mean = pd.Series(rank_means, index=np.arange(1, len(rank_means) + 1))
    ranks = df_input.rank(method="min").stack().astype(int)
    return ranks.map(rank_to_mean).unstack()


df = pd.DataFrame({
    "A": [1, 2, 3, 4],
    "B": [10, 20, 30, 40],
    "C": [4, 1, 3, 2],
    "D": [5, 5, 5, 5],
})

print(quantile_norm(df).round(3))
       A      B      C     D
0   4.25   4.25  13.25  4.25
1   7.25   7.25   4.25  4.25
2  10.25  10.25  10.25  4.25
3  13.25  13.25   7.25  4.25

A coluna constante D mostra por que a hipótese de distribuição compartilhada importa: todos os seus valores repetidos recebem a menor posição e são mapeados para 4.25, de modo que sua distribuição empírica não corresponde à das outras colunas. Para recursos numéricos comuns, compare os métodos pelo objetivo: escolha z-scores para centralizar e escalar pelo desvio padrão, min-max para obter um intervalo limitado levando em conta os valores discrepantes, ou normalização por quantis quando os dados justificarem alinhar as distribuições das colunas.