Pandas: Manipulação de Estruturas de Dados em Python

O Pandas expande as capacidades do NumPy ao introduzir estruturas de dados voltadas à análise prática. O Series representa uma dimensão, enquanto o DataFrame organiza informações em formato tabular bidimensional. A biblioteca se concentra na relação entre índices e valores, facilitando extração, transformação e agregação.

Series

Um Series funciona como um arranjo unidimensional indexado, compotso por valores e rótulos associados.

Criação a partir de listas

É possível criar um Series passando uma lista de valores, definindo índices significativos e um nome descritivo.

import pandas as pd
import numpy as np

precos = [10.5, 8.2, 12.0, 6.3, 9.8]
frutas = ['maçã', 'laranja', 'uva', 'pera', 'pitaya']

sr_precos = pd.Series(precos, index=frutas, name='preco_frutas')

print(sr_precos.index)
print(sr_precos.values)
print(sr_precos.name)

Criação a partir de dicionários

Quando o Series é criado a partir de um dicionário, as chaves tornam-se os índices. O parâmetro index pode restringir, reordenar ou adicionar novos rótulos, preenchendo automaticamente com NaN os rótulos ausentes.

estoque = {'maçã': 45, 'laranja': 30, 'uva': 20, 'pera': 15}

sr_estoque = pd.Series(estoque)
sr_filtro = pd.Series(estoque, index=['maçã', 'pera', 'banana'])

print(sr_filtro)

Criação a partir de arranjos NumPy

arranjo = np.arange(10, 16)
sr_numeros = pd.Series(arranjo, index=range(10, 16))

Cópia e referência

Ao construir um Series a partir de outro, o Pandas gera uma cópia dos dados. Para reutilizar a mesma estrutura, altere os valores através de atribuições diretas aos índices.

sr_original = pd.Series([15, 25, 35, 45])
sr_novo = pd.Series(sr_original)

sr_novo.iloc[0] = 100
print(sr_original.iloc[0])  # 15, manteve-se inalterado

Acesso e filtragem em Series

O acesso pode ser feito por rótulo, por posição ou por máscara booleana. Slices com rótulos são inclusivos nas extremidades, ao contrário de slices por posição.

temperaturas = pd.Series(
    [22, 25, 19, 28],
    index=['seg', 'ter', 'qua', 'qui'],
    name='temp_media'
)

print(temperaturas[['seg', 'qui']])
print(temperaturas['seg':'qua'])
print(temperaturas[temperaturas > 20])

temperaturas[['seg', 'qua']] = [23, 20]

Valores distintos e frequências

categorias = pd.Series(['A', 'B', 'A', 'C', 'B', 'A'])

print(categorias.unique())
print(categorias.value_counts())
print(categorias.isin(['A', 'C']))
print(temperaturas.isnull())

DataFrame

Um DataFrame é uma estrutura bidimensional formada por Series alinhadas por um índice comum. Cada coluna pode possuir um tipo de dado distinto.

Criação a partir de dicionário de listas

dados_alunos = {
    'nome': ['Ana', 'Bruno', 'Carla', 'Daniel'],
    'nota': [8.5, 7.0, 9.2, 6.8]
}

df = pd.DataFrame(dados_alunos, index=['a', 'b', 'c', 'd'])

Criação a partir de lista de dicionários

registros = [
    {'disciplina': 'Matemática', 'carga': 60},
    {'disciplina': 'Física', 'carga': 45},
    {'disciplina': 'Química', 'carga': 50}
]

df_cursos = pd.DataFrame(registros)

Criação a partir de Series

nomes = pd.Series(['Ana', 'Bruno', 'Carla'], index=[1, 2, 3])
notas = pd.Series([8.5, 7.0, 9.2], index=[1, 2, 3])

df_notas = pd.DataFrame({'aluno': nomes, 'nota': notas})

Concatenação de Series em DataFrame

produto = pd.Series(['Teclado', 'Mouse', 'Monitor'])
quantidade = pd.Series([15, 40, 12])

df_estoque = pd.concat([produto, quantidade], axis=1)
df_estoque.columns = ['produto', 'quantidade']

Acesso a dados do DataFrame

A seleção de colunas pode ser feita por notação de atributo para uma única coluna ou por notação de dicionário para uma ou mais colunas. O loc utiliza rótulos, enquanto o iloc utiliza posições inteiras.

df_estoque['produto']
df_estoque[['produto', 'quantidade']]
df_estoque.loc[0]
df_estoque.iloc[0:2, 0:1]
df_estoque.loc[0, 'quantidade']

Leitura e escrita de dados

CSV

df_lido = pd.read_csv('dados.csv')
amostra = pd.read_csv('dados.csv', nrows=100)

blocos = pd.read_csv('dados.csv', chunksize=50)
for bloco in blocos:
    processar(bloco)

JSON

df_json = pd.read_json('dados.json')
df_json.to_json('saida.json')

Escrita

df.to_csv('saida.csv', index=False)
df.to_excel('saida.xlsx', sheet_name='Planilha1')

Tratamento de valores asuentes

O Pandas representa dados faltantes por NaN para valores numéricos e permite o uso de None para objetos Python. Ambos são tratados de maneira equivalente pelos métodos de detecção e preenchimento.

valores = pd.Series([10, None, 30, np.nan, 50])

print(valores.isna())
print(valores.dropna())
print(valores.fillna(0))
print(valores.ffill())

Em DataFrames, é comum aplicar operações por eixo e preencher com estatísticas descritivas.

df_exemplo = pd.DataFrame({
    'A': [1, np.nan, 3],
    'B': [4, 5, np.nan]
})

df_limpo = df_exemplo.dropna()
df_preenchido = df_exemplo.fillna(df_exemplo.mean(numeric_only=True))

Tags: pandas NumPy Python CSV JSON

Publicado em 7-27 07:26