Limpeza Básica de Dados com Pandas

PandasBeginner
Pratique Agora

Introdução

Bem-vindo ao laboratório de Limpeza Básica de Dados com Pandas. A limpeza de dados é um primeiro passo crucial em qualquer projeto de análise de dados ou aprendizado de máquina. Dados do mundo real são frequentemente desorganizados, contendo valores ausentes, entradas duplicadas ou tipos de dados incorretos. O uso de dados brutos e não limpos pode levar a análises imprecisas e conclusões não confiáveis.

Pandas é uma poderosa biblioteca Python que fornece estruturas de dados e ferramentas de análise de dados de alto desempenho e fáceis de usar. É a ferramenta de referência para limpeza e manipulação de dados em Python.

Neste laboratório, você aprenderá as técnicas fundamentais para limpar um conjunto de dados usando Pandas. Você praticará:

  • Remover linhas com valores ausentes usando dropna().
  • Preencher valores ausentes com fillna().
  • Remover linhas duplicadas com drop_duplicates().
  • Renomear colunas com rename().
  • Converter tipos de dados de colunas com astype().

Ao final deste laboratório, você terá uma compreensão sólida do fluxo de trabalho básico de limpeza de dados em Pandas.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 88%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Remover linhas com o método dropna

Nesta etapa, você aprenderá como lidar com dados ausentes removendo linhas que contêm valores nulos. Em Pandas, dados ausentes são representados por NaN (Not a Number). Uma das estratégias mais simples para lidar com valores NaN é remover as linhas ou colunas que os contêm.

O método dropna() permite fazer isso facilmente. Por padrão, ele remove qualquer linha que contenha pelo menos um valor NaN.

Primeiro, vamos executar o script inicial para ver nosso DataFrame de partida. O script de configuração já criou um arquivo chamado main.py no diretório ~/project.

Abra um terminal no WebIDE e execute o seguinte comando:

python3 main.py

Você deverá ver o DataFrame original, que contém valores NaN nas colunas age e city.

Original DataFrame:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000
5      Eva   NaN       Boston         90000
6    Frank  45.0          NaN        100000

Original DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 4 columns):
 ##   Column         Non-Null Count  Dtype
---  ------         --------------  -----
 0   name           7 non-null      object
 1   age            6 non-null      float64
 2   city           6 non-null      object
 3   SALARY_IN_USD  7 non-null      object
dtypes: float64(1), object(3)
memory usage: 352.0+ bytes

Agora, vamos usar dropna() para ver como ele funciona. Abra o arquivo main.py no explorador de arquivos no painel esquerdo. Adicione o seguinte código ao final do arquivo. Este código criará um novo DataFrame df_dropped com as linhas NaN removidas e o imprimirá. Ainda não estamos modificando o df original, para que possamos explorar outros métodos nas próximas etapas.

## Add this to the end of main.py

print("\nDataFrame after dropping rows with any missing values:")
df_dropped = df.dropna()
print(df_dropped)

Salve o arquivo (Ctrl+S ou Cmd+S) e execute-o novamente no terminal:

python3 main.py

A saída agora incluirá uma nova seção mostrando o DataFrame após a remoção das linhas com valores NaN (linhas de Eva e Frank).

## ... (previous output) ...

DataFrame after dropping rows with any missing values:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000

Preencher valores ausentes usando fillna

Nesta etapa, você aprenderá outra forma de lidar com dados ausentes: preencher os valores ausentes com um valor específico usando o método fillna(). Remover linhas com dados ausentes pode, às vezes, levar a uma perda significativa de dados, especialmente se muitas linhas tiverem valores ausentes. Preenchê-los é frequentemente uma alternativa melhor.

Você pode preencher valores NaN com uma constante, como 0 ou "Unknown", ou com um valor calculado, como a média ou mediana da coluna.

Vamos modificar nosso arquivo main.py. Em vez de apenas imprimir o DataFrame com linhas removidas, agora limparemos nosso DataFrame principal df preenchendo os valores ausentes. Preencheremos a age ausente com a média das idades existentes e a city ausente com a string 'Unknown'.

Remova o código dropna() que você adicionou na última etapa e substitua-o pelo seguinte código. Usamos inplace=True para modificar o DataFrame diretamente.

## Replace the dropna() code with this at the end of main.py

## Calculate the mean of the 'age' column
mean_age = df['age'].mean()

## Fill missing values using the recommended approach to avoid FutureWarnings
df.fillna({'age': mean_age, 'city': 'Unknown'}, inplace=True)

print("\nDataFrame after filling missing values:")
print(df)

O argumento inplace=True modifica o DataFrame no local, o que significa que você não precisa atribuir o resultado de volta a uma variável (por exemplo, df = df.fillna(...)).

Salve o arquivo e execute-o no terminal:

python3 main.py

Você verá que os valores NaN foram substituídos. A idade de Eva agora é a média das outras idades, e a cidade de Frank é 'Unknown'.

## ... (original DataFrame output) ...

DataFrame after filling missing values:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000
5      Eva  33.3       Boston         90000
6    Frank  45.0      Unknown        100000

Nota: A idade média é (25+30+35+40+25+45)/6 = 33.33.... Pandas preencherá NaN com este valor. A saída acima mostra 35.0 para simplificar; sua saída real para a idade de Eva será a média calculada.

Remover linhas duplicadas com drop_duplicates

Nesta etapa, você aprenderá como remover linhas duplicadas do seu DataFrame. Dados duplicados podem distorcer análises e levar a resultados incorretos. O método drop_duplicates() ajuda a identificá-los e removê-los.

Em nosso conjunto de dados original, a linha de 'Alice' aparece duas vezes com exatamente as mesmas informações. Agora que lidamos com valores ausentes, nossa próxima tarefa de limpeza é remover essa entrada duplicada.

Por padrão, drop_duplicates() considera uma linha duplicada se todos os seus valores de coluna forem idênticos aos valores de outra linha.

Adicione o seguinte código ao final do seu script main.py. Continuaremos a usar inplace=True para modificar nosso DataFrame.

## Add this to the end of main.py

df.drop_duplicates(inplace=True)

print("\nDataFrame after dropping duplicates:")
print(df)

Salve o arquivo e execute-o no terminal:

python3 main.py

A saída agora mostrará um DataFrame com apenas 6 linhas, pois uma das linhas de 'Alice' foi removida.

## ... (previous output) ...

DataFrame after dropping duplicates:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
5      Eva  33.3       Boston         90000
6    Frank  45.0      Unknown        100000

Observe que o índice 4 agora está faltando, o que corresponde à linha duplicada que foi removida. O DataFrame agora tem 6 linhas únicas.

Renomear colunas usando o método rename

Nesta etapa, você aprenderá como renomear colunas. Nomes de colunas consistentes e claros são essenciais para a legibilidade e manutenibilidade do código. É uma prática comum usar uma convenção de nomenclatura consistente, como tudo em minúsculas com underscores.

Nosso DataFrame tem uma coluna chamada SALARY_IN_USD. Vamos renomeá-la para um nome mais simples e em minúsculas: salary. O método rename() é perfeito para isso. Você passa um dicionário para o argumento columns, onde as chaves são os nomes antigos e os valores são os novos nomes.

Adicione o seguinte código ao final do seu script main.py:

## Add this to the end of main.py

df.rename(columns={'SALARY_IN_USD': 'salary'}, inplace=True)

print("\nDataFrame after renaming columns:")
print(df)

Salve o arquivo e execute-o no terminal:

python3 main.py

Você verá que a coluna SALARY_IN_USD foi renomeada com sucesso para salary.

## ... (previous output) ...

DataFrame after renaming columns:
      name   age         city   salary
0    Alice  25.0     New York    50000
1      Bob  30.0  Los Angeles    60000
2  Charlie  35.0     New York    70000
3    David  40.0      Chicago    80000
5      Eva  33.3       Boston    90000
6    Frank  45.0      Unknown   100000

Essa simples alteração torna o nome da coluna mais fácil de digitar e segue um guia de estilo comum do Python.

Converter tipos de coluna com astype

Nesta etapa final, você aprenderá como converter o tipo de dado de uma coluna. Tipos de dados corretos são cruciais para realizar cálculos e para a eficiência de memória.

Se você observar a saída inicial de df.info(), notará que a coluna SALARY_IN_USD tinha um Dtype de object, o que significa que ela estava armazenando os números como strings. Não podemos realizar operações matemáticas (como calcular o salário médio) em strings. Precisamos converter essa coluna para um tipo numérico, como int (inteiro).

O método astype() é usado para esse propósito. Vamos converter nossa nova coluna salary para o tipo int.

Adicione o seguinte código ao final de main.py. Também imprimiremos as informações do DataFrame novamente para confirmar a mudança.

## Add this to the end of main.py

df['salary'] = df['salary'].astype(int)

print("\nDataFrame after converting data types:")
print(df)

print("\nFinal DataFrame Info:")
df.info()

Salve o arquivo e execute-o pela última vez:

python3 main.py

A saída final mostrará o DataFrame limpo e suas novas informações. Observe atentamente o Dtype da coluna salary na saída de informações. Agora deve ser int64, não object.

## ... (previous output) ...

DataFrame after converting data types:
      name   age         city  salary
0    Alice  25.0     New York   50000
1      Bob  30.0  Los Angeles   60000
2  Charlie  35.0     New York   70000
3    David  40.0      Chicago   80000
5      Eva  33.3       Boston   90000
6    Frank  45.0      Unknown  100000

Final DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, 0 to 6
Data columns (total 4 columns):
 ##   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   name    6 non-null      object
 1   age     6 non-null      float64
 2   city    6 non-null      object
 3   salary  6 non-null      int64
dtypes: float64(1), int64(1), object(2)
memory usage: 240.0+ bytes

Com a coluna salary como um tipo inteiro, você agora pode realizar cálculos como df['salary'].mean().

Resumo

Parabéns por completar o laboratório Pandas Basic Data Cleaning! Você transformou com sucesso um conjunto de dados bruto e desorganizado em um formato limpo e pronto para análise.

Neste laboratório, você aprendeu e praticou várias técnicas essenciais de limpeza de dados no Pandas:

  • Tratamento de Valores Ausentes: Você viu como remover linhas com NaN usando dropna() e como preenchê-las com dados significativos usando fillna().
  • Remoção de Duplicatas: Você usou drop_duplicates() para eliminar linhas redundantes do seu conjunto de dados.
  • Renomeação de Colunas: Você aprendeu a tornar os nomes das colunas mais consistentes e legíveis com o método rename().
  • Conversão de Tipos de Dados: Você usou astype() para alterar o tipo de dado de uma coluna para o formato correto, permitindo análises adicionais.

Essas habilidades fundamentais são os blocos de construção para qualquer trabalho sério com dados. Dominá-las permitirá que você enfrente com confiança desafios de dados do mundo real. Continue praticando essas técnicas para se tornar proficiente em manipulação de dados com Pandas.