Introdução
Bem-vindo ao Laboratório de Fundamentos do Pandas! Neste laboratório, exploraremos alguns aspectos fundamentais da biblioteca Pandas: uso de memória de DataFrame, tratamento de instruções if/truth, uso de métodos de Funções Definidas pelo Usuário (UDF - User Defined Function), tratamento de valores NA, diferenças com NumPy e considerações sobre segurança de threads.
Dicas da VM
Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.
Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.
Compreendendo o Uso de Memória do DataFrame
O Pandas fornece vários métodos para entender o uso de memória de um DataFrame. O método .info() pode ser usado para ver um resumo, incluindo o uso de memória.
import pandas as pd
import numpy as np
## Create a DataFrame
dtypes = ["int64", "float64", "datetime64[ns]", "timedelta64[ns]", "complex128", "object", "bool"]
n = 5000
data = {t: np.random.randint(100, size=n).astype(t) for t in dtypes}
df = pd.DataFrame(data)
df["categorical"] = df["object"].astype("category")
## Display DataFrame info
df.info()
Usando Instruções if/truth com Pandas
O Pandas não suporta o uso direto de instruções if/truth devido à ambiguidade. Em vez disso, use métodos como .any(), .all() ou .empty().
## Check if any value in the Series is True
if pd.Series([False, True, False]).any():
print("At least one True value in the Series")
Mutação com Métodos de Funções Definidas pelo Usuário (UDF)
Ao usar um método pandas que recebe uma UDF, evite alterar o DataFrame dentro da UDF. Em vez disso, faça uma cópia antes de fazer as alterações.
def f(s):
s = s.copy()
s.pop("a")
return s
df = pd.DataFrame({"a": [1, 2, 3], 'b': [4, 5, 6]})
df.apply(f, axis="columns")
Lidando com Valores NA
O Pandas fornece tipos de dados de extensão de inteiro anulável (nullable-integer extension dtypes) para representar inteiros com valores possivelmente ausentes.
s_int = pd.Series([1, 2, 3, 4, 5], index=list("abcde"), dtype=pd.Int64Dtype())
s2_int = s_int.reindex(["a", "b", "c", "f", "u"])
Compreendendo as Diferenças com NumPy
Pandas e NumPy têm pequenas diferenças na forma como calculam a variância. Isso é importante a considerar ao alternar entre as duas bibliotecas.
## Variância em pandas
var_pandas = df.var()
## Variância em NumPy
var_numpy = np.var(df.values)
Considerações sobre Thread-safety em Pandas
Pandas não é 100% thread safe. Tenha cautela ao compartilhar objetos pandas entre múltiplos threads.
Lidando com Problemas de Byte-ordering
Você pode encontrar problemas de byte-ordering ao lidar com dados criados em uma máquina com uma ordem de bytes diferente. Converta os dados para a ordem de bytes nativa do sistema antes de passá-los para Pandas.
x = np.array(list(range(10)), ">i4") ## big endian
newx = x.byteswap().newbyteorder() ## force native byteorder
s = pd.Series(newx)
Resumo
Neste laboratório, exploramos alguns aspectos cruciais da biblioteca Pandas. Compreender esses aspectos o ajudará a utilizar Pandas de forma mais eficaz e a evitar armadilhas comuns.