Guia Básico para tratar dados com Pandas em Python
Tags: pandas, python, dataframe, datascience
Published: 2024-06-22 16:42:01

Olá, esse guia tem como objetivo apresentar algumas formas de tratamento de dados com a biblioteca pandas do Python, umas das mais utilizadas por profissionais na área de dados.
Primeiro, vamos fazer a importação das respectivas bibliotecas que utilizaremos
`
import pandas as pd
import matplotlib.pylab as plt
#Agora, faremos a leitura da nossa base de dados
url= "https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-DA0101EN-SkillsNetwork/labs/Data%20files/auto.csv"
`
Note que, ao fazermos a importação da base de dados, a mesma não tem cabeçalho, então para criar o cabeçalho faremos o processo abaixo:
`
#Criacao do cabeçalho em uma lista com seus respectivos valores
cabecalho = ["symboling","normalized-losses","make","fuel-type","aspiration", "num-of-doors","body-style",
         "drive-wheels","engine-location","wheel-base", "length","width","height","curb-weight","engine-type",
         "num-of-cylinders", "engine-size","fuel-system","bore","stroke","compression-ratio","horsepower",
         "peak-rpm","city-mpg","highway-mpg","price"]

#Adicionando o cabeçalho ao dataset que não tem cabeçalho + leitura do dataset no formato csv
df = pd.read_csv(url, names = cabecalho)
`
Nesse exemplo, o valores pendentes vão estar como “?” (interrogação). Alguma dúvidas podem surgir: o que fazer com esses valores que não vieram ? Como tratar ? Posso deletar ? …

A resposta é: Depende.. Existe algumas técnicas que podemos utilizar:

- Apagar a coluna completa que está sem as informações;
- Apagar a linha completa que está sem as informações;
- Substituir os dados pela média/frequência/etc;
Essas são algumas, existem várias outras forma de lidarmos com esses dados pendentes
`
#Para visualizar alguns dados,usarmos o comando abaixo
df.head()
`
Note que, como havia informado anteriormente, alguns dados pendentes estão como “?” , agora, vamos substituir esses valores por NaN (Not a number)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvfqph18kqoxtu57fq8w.png)


`
import numpy as np
#O comando abaixo substituirá ? por NaN;
# O parâmetro inplace = True, salva as alterações realizadas no dataframe que estamos usando (df)
df.replace('?', np.nan, inplace = True)

#Ao executar o head(), você notará que o símbolo de interrogação foi substituido por NaN
df.head()
`

## Tratando (substituindo) os dados pendentes
No algoritmo abaixo, iremos substituir os valores NaN da coluna normalized-losses pela média, depois que convertermos para o tipo float

`avg_norm_loss = df["normalized-losses"].astype("float").mean(axis=0)
print("Média da normalized-losses:", avg_norm_loss)

#substituir os valores NaN da coluna normalized-losses pela média
df["normalized-losses"].replace(np.nan, avg_norm_loss, inplace=True)
`

E assim podemos dar prosseguimento para todas as outras colunas que tiverem informações pendentes. Algumas dúvidas podem surgir, porque foi feita a conversão da normalized-losses para float ? A respota é: Normalized-losses é do tipo objetct, que seria semelhante a “string”, dessa forma não é possível realizarmos operações matemáticas nesse tipo de objeto, por isso fizemos a conversão.

`avg_bore=df['bore'].astype('float').mean(axis=0)
print("Média da bore:", avg_bore)

#Substituindo valores NaN da coluna Bore pela média
df["bore"].replace(np.nan, avg_bore, inplace=True)

#Substituindo valores NaN da coluna stroke pela média
stroke_mean = df['stroke'].astype('float').mean(axis=0)
df['stroke'].replace(np.nan, stroke_mean, inplace=True)
avg_horsepower = df['horsepower'].astype('float').mean(axis=0) 

#Substituindo os valores NaN da coluna 'horsepower' pela média
df['horsepower'].replace(np.nan, avg_horsepower, inplace=True)
`
No exemplo abaixo, vamos deletar todos os registros (linhas) que não tem dados da coluna price:

`df.dropna(subset=["price"], axis=0, inplace=True)`

Algumas informações que podem ser importantes:
- axis = 0 >> O zero refere-se as linha .\. 1 refere-se as colunas
- inplace >> Salva as alterações realizadas no dataframe

## Conversão de dados
Como já foi apresentado anteriormente, outra parte fundamental do tratamento dos dados são os tipos de dados na biblioteca pandas: object, float, int,datetime, etc. Afinal, não conseguimos calcular a média de uma variável do tipo string, certo ? Então, precisamos converter o seu data type para que isso seja possível.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/auzj7rvuj3pm2cy4k1ay.png)


 
Para analisarmos os tipos de dados em pandas, podemos usar a função dtype

`#Verificando o datype em python
#Ela retornara o datatype de todas as variáveis (colunas) do nosso data frame
df.dtypes
# Abaixo, realizamos a conversão dos data types para float, int e atribuimos a conversão a propria
# variável para "salvar" as alterações. Passamos no parâmetro astype("valordavariável")
df[["bore", "stroke"]] = df[["bore", "stroke"]].astype("float")
df[["normalized-losses"]] = df[["normalized-losses"]].astype("int")
df[["price"]] = df[["price"]].astype("float")
df[["peak-rpm"]] = df[["peak-rpm"]].astype("float")`

Antes de fazer a conversão, sempre procure análisar o data type atual da variável com (dtypes) e analisar novamente após a conversão, para garantir que a alteração foi realizada com sucesso.

> Esse foi um guia básico e prático de como trabalhar com tratamento de dados utilizando a biblioteca Python, as informações disponibilizadas aqui foram colhidas do curso de Análise de dados com Python — IBM da Cousera, recomendo a todos que estão estudando e procurando ampliar o seu conhecimento nessa área darem uma olhada ou até mesmo realizarem o curso, que apesar de básico é muito bom ! Obrigado a todos por lerem até aqui !

for column in missing_data.columns.values.tolist():
    print(column)
    print (missing_data[column].value_counts())
    print("")