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))