Consulta e modificação

Testing phase Atividades: This section is currently being validated and may change.

Depois de inspecionar a estrutura, o próximo passo é selecionar subconjuntos relevantes e modificar o DataFrame para responder perguntas específicas.

Seleção de colunas

# Uma coluna (Series)
df["titulo"]

# Várias colunas (DataFrame)
df[["titulo", "data", "horario"]]

Estes comandos são usados para visualisar a coluna selecionada.

Seleção de linhas

Por posição (.iloc)

Indexação baseada em números inteiros para seleção por posição.

df.iloc[0]            # primeira linha
df.iloc[-1]           # última linha
df.iloc[0:5]          # cinco primeiras linhas
df.iloc[0:5, 0:2]     # cinco linhas, duas colunas

Possível Erro Index Error: Caso o indexador solicirado estiver fora dos limites.

Por rótulo de índice (.loc)

Indexação baseada em rótulos e também em matrizes booleanas.

df.loc[0]                              # rótulo 0
df.loc[df["data"] == "2023-01-15"]     # filtro por valor
df.loc[0, "titulo"]                    # uma célula
df.loc[0:5, ["titulo", "data"]]        # fatiamento + colunas

Possíveis Erros
Key Error: Se nenhum ítem for encontrado
Indexing Error: Ocorre quando uma chave indexada é fornecida, mas seu índice não é passível de alinhamento com o índice do DataFrame (frame index).

💡 Dica

Use .loc[] quando o índice for significativo (datas, IDs); use .iloc[] quando quiser pegar “as primeiras N linhas” ou similar. Quando estiver em dúvida, .loc[] é mais legível.

Filtros booleanos

Toda comparação aplicada a uma coluna devolve uma Series booleana:

df["data"] > "2020-01-01"
# 0    False
# 1    False
# ...
# 5039  True
# Name: data, dtype: bool

Essa Series booleana pode ser usada para filtrar:

notas_recentes = df[df["data"] > "2020-01-01"]

Operadores lógicos

Para combinar condições, use & (E), | (OU) e ~ (NÃO). Sempre com parênteses ao redor de cada condição:

# Notas de 2020 que têm "Brasil" no título
filtro = (df["data"] >= "2020-01-01") & (df["titulo"].str.contains("Brasil"))
df[filtro]

# Notas que NÃO são de 2024
df[~(df["data"].str.startswith("2024"))]
Operador PandasEquivalente PythonSignificado
&andE lógico
|orOU lógico
~notNegação
⚠️ Aviso

Não use and, or, not em filtros de DataFrame — eles operam em valores escalares, não em séries inteiras. O resultado é um ValueError.

.isin() para múltiplos valores

Este método compara todos os valores do DF com o valor especificado dentro dos parênteses. Caso esses valores existam, são retornados na forma de DF com as indicaçõe de True e False, este DF é chamado de “máscara booleana”.

anos_alvo = ["2020", "2021", "2022"]
df[df["data"].str[:4].isin(anos_alvo)]

.str para operações textuais

Series.str aplica operações de string a cada elemento da coluna:

df[df["titulo"].str.contains("Mercosul", case=False, na=False)]
df[df["titulo"].str.startswith("NOTA")]
df[df["titulo"].str.len() > 50]

na=False evita que valores NaN quebrem o filtro.

Aqui está o conteúdo organizado e explicado em formato .mdx, ideal para a documentação do seu site no Astro.


Modificação

A modificação de dados é o coração do Pandas. Ela permite transformar dados brutos em informações úteis para análise.

Criar uma coluna

Você pode criar novas colunas atribuindo valores a uma chave que ainda não existe no DataFrame.

  • Extração de datas: O método pd.to_datetime converte strings em objetos de data reais. O acessador .dt permite extrair partes específicas como year (ano) ou month (mês).
  • Manipulação de texto: O acessador .str permite tratar o conteúdo da coluna como strings. O .slice(0, 30) é útil para criar resumos ou títulos curtos, limitando a quantidade de caracteres.
df["ano"] = pd.to_datetime(df["data"]).dt.year
df["mes"] = pd.to_datetime(df["data"]).dt.month
df["titulo_curto"] = df["titulo"].str.slice(0, 30)

Atualizar valores condicionalmente

Muitas vezes, a criação ou alteração de uma coluna depende de uma regra lógica.

  • Máscaras Booleanas: No exemplo de df["longa"], o Pandas cria uma coluna de True/False baseada no comprimento do texto.
  • Uso do .loc: Esta é a forma mais segura de alterar valores. O comando df.loc[condição, coluna] = valor localiza as linhas que atendem à condição e altera apenas a coluna especificada. É ideal para limpar dados, como substituir “00:00” por None (vazio).
# Marcar notas longas (True se parágrafos > 5)
df["longa"] = df["paragrafos"].str.len() > 5

# Substituir valor específico usando localização explícita
df.loc[df["horario"] == "00:00", "horario"] = None

Remover colunas e linhas

Existem duas formas principais de remover dados:

  1. drop: Remove explicitamente pelo nome da coluna ou rótulo do índice.
  • inplace=True: Modifica o DataFrame original. Sem isso, o Pandas apenas te mostra como ficaria o resultado, mas não salva a alteração.
  1. Filtragem: Em vez de “apagar” o que você não quer, você cria um novo DataFrame contendo apenas o que você quer manter. É uma forma mais funcional e segura de trabalhar.
df.drop(columns=["horario_atualizado"], inplace=True) # Modifica o arquivo atual

# Remove as 3 primeiras linhas pelo índice
df.drop(index=[0, 1, 2])

# Filtro: mantém apenas onde o título não é "NA"
df = df[df["titulo"] != "NA"]

Renomear colunas

  • rename: Ideal para trocar o nome de apenas algumas colunas específicas usando um dicionário { "nome_antigo": "nome_novo" }.
  • Atribuição direta: Ao usar df.columns = [...], você deve fornecer uma lista com nomes para todas as colunas, na ordem exata.
df.rename(columns={"horario": "hora_publicacao"}, inplace=True)

Ordenação

A ordenação facilita a visualização de tendências temporais ou rankings.

  • Crescente vs Decrescente: Por padrão, o sort_values é crescente. Use ascending=False para inverter (ex: ver as datas mais recentes primeiro).
  • Múltiplas chaves: Você pode passar uma lista de colunas. O Pandas ordenará pela primeira e, em caso de empate, usará a segunda para desempatar.
  • sort_index: Útil quando você quer organizar o DataFrame pela sua “etiqueta” lateral (ID ou Data, caso a data seja o índice).
df.sort_values(["ano", "mes"], ascending=[True, True]) # Ordena por ano e depois por mês
df.sort_index() # Organiza pela ordem do índice (ex: 0, 1, 2...)

Resumo

OperaçãoComando
Selecionar colunadf["c"] ou df[["c1", "c2"]]
Selecionar linha por posiçãodf.iloc[i]
Selecionar linha por rótulodf.loc[r]
Filtrardf[df["c"] > x]
Combinar filtrosdf[(c1) & (c2)]
Adicionar colunadf["nova"] = ...
Remover colunadf.drop(columns=["c"])
Ordenardf.sort_values("c")