Pular para o conteúdo

Como Iterar sobre Linhas usando o Pandas?

[

Como iterar sobre as linhas em um DataFrame do pandas e por que você não deveria fazer isso

Uma das perguntas mais comuns que você pode ter ao ingressar no mundo do pandas é como iterar sobre as linhas em um DataFrame do pandas. Se você já está confortável usando loops no Python básico, então esta é uma pergunta perfeitamente natural a ser feita.

Embora iterar sobre as linhas seja relativamente simples com .itertuples() ou .iterrows(), isso não significa necessariamente que a iteração é a melhor maneira de trabalhar com DataFrames. Na verdade, embora a iteração possa ser uma maneira rápida de fazer progresso, depender da iteração pode se tornar um grande obstáculo quando se trata de ser eficiente com o pandas.

Neste tutorial, você aprenderá como iterar sobre as linhas em um DataFrame do pandas, mas também aprenderá por que provavelmente você não vai querer fazer isso. Geralmente, você deve evitar a iteração porque isso tem um desempenho ruim e vai contra a maneira usual de usar o pandas.

Para acompanhar este tutorial, você pode baixar os conjuntos de dados e exemplos de código no seguinte link:

A última etapa de preparação é criar um ambiente virtual e instalar alguns pacotes:

  • Windows
  • Linux + macOS

PowerShell do Windows

PS> python -m venv venv
PS> venv\Scripts\activate
(venv) PS> python -m pip install pandas httpx codetiming

Shell do Linux/macOS

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pandas httpx codetiming

A instalação do pandas não é surpreendente, mas você pode se perguntar sobre os outros pacotes. Você usará o pacote httpx para fazer algumas solicitações HTTP como parte de um exemplo e o pacote codetiming para fazer algumas comparações rápidas de desempenho.

Com isso, você está pronto para começar a aprender como iterar sobre as linhas, por que você provavelmente não vai querer fazer isso e quais outras opções descartar antes de recorrer à iteração.

Como iterar sobre as linhas de um DataFrame no pandas

Embora seja incomum, há algumas situações em que você pode usar a iteração em um DataFrame. Essas situações são geralmente aquelas em que você:

  • Precisa alimentar as informações de um DataFrame do pandas sequencialmente em outra API
  • Precisa que a operação em cada linha gere um efeito colateral, como uma solicitação HTTP
  • Possui operações complexas para realizar envolvendo várias colunas no DataFrame
  • Não se importa com a penalidade de desempenho da iteração, talvez porque trabalhar com os dados não seja o gargalo, o conjunto de dados seja muito pequeno ou seja apenas um projeto pessoal

Um caso de uso comum para o uso de loops no pandas é quando você está explorando e experimentando dados de forma interativa. Nesses casos, o desempenho geralmente é menos importante. Ao iterar sobre as linhas de dados, você pode exibir e conhecer as linhas individuais. Com base nessa experiência, você pode implementar abordagens mais eficazes posteriormente.

Como exemplo de um caso de uso mais permanente, imagine que você tenha uma lista de URLs em um DataFrame e queira verificar quais URLs estão online. Aqui está um exemplo de como você pode fazer isso usando a iteração:

import pandas as pd
import requests
df = pd.DataFrame({"URL": ["https://site1.com", "https://site2.com", "https://site3.com"]})
for index, row in df.iterrows():
url = row["URL"]
response = requests.get(url)
if response.status_code == 200:
print(f"{url} is online")
else:
print(f"{url} is offline")

Nesse exemplo, estamos iterando sobre as linhas do DataFrame usando o método iterrows(). Em cada iteração, obtemos a URL da coluna “URL” e fazemos uma solicitação HTTP para verificar o código de status da resposta. Se o código de status for igual a 200, imprime que a URL está online, caso contrário, imprime que está offline.

Embora esse código funcione, ele é muito lento, pois faz uma solicitação HTTP para cada linha do DataFrame. Além disso, se você tiver um grande DataFrame, ficará ainda mais lento. Isso ocorre principalmente porque a iteração não está usando métodos vetorizados eficientes do pandas.

Por que você deve evitar iterar sobre as linhas no pandas

A iteração sobre as linhas em um DataFrame do pandas geralmente deve ser evitada por várias razões:

  1. Desempenho inferior: A iteração é muito mais lenta do que o uso de métodos vetorizados do pandas. Os métodos vetorizados aplicam operações em larga escala a todo o DataFrame de uma só vez, enquanto a iteração faz uma operação de cada vez.
  2. Código complexo: A iteração muitas vezes requer código mais complexo com laços for e if. Isso torna o código mais difícil de ler e entender.
  3. Fácil de cometer erros: Ao iterar sobre as linhas, é mais fácil cometer erros, como indexação incorreta ou esquecer de lidar com valores ausentes. Os métodos vetorizados ajudam a evitar esses erros, lidando com eles internamente.
  4. Menos flexibilidade: A iteração limita a flexibilidade das operações que você pode realizar. Os métodos vetorizados do pandas oferecem uma ampla gama de funcionalidades, como aplicar funções personalizadas a colunas e combinar dados de diferentes DataFrames.
  5. Pandas é otimizado para vetorização: O pandas é construído com a vetorização em mente e oferece uma série de métodos que podem ser aplicados de forma eficiente em todo o DataFrame. Usar esses métodos aumenta muito o desempenho do pandas e é considerado a maneira mais idiomática de trabalhar com os DataFrames.

Use métodos vetorizados em vez de iteração

Em vez de iterar sobre as linhas em um DataFrame, é recomendável usar métodos vetorizados do pandas, que são mais eficientes e fáceis de usar. Esses métodos aplicam operações em larga escala a todo o DataFrame, em vez de uma operação de cada vez.

Aqui estão alguns exemplos de métodos vetorizados:

  • apply(): Aplica uma função a uma coluna ou linha do DataFrame.
  • map(): Aplica uma função a cada elemento de uma coluna.
  • fillna(): Preenche valores ausentes em colunas com um valor especificado.
  • groupby(): Agrupa o DataFrame por uma ou mais colunas e calcula estatísticas agregadas.
  • merge(): Combina dois DataFrames com base em uma coluna em comum.
  • sort_values(): Classifica o DataFrame com base em uma ou mais colunas.
  • str.contains(): Verifica se uma coluna contém um determinado padrão de texto.

Aqui está um exemplo de como usar o método apply() para calcular a média de uma coluna em um DataFrame:

import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3, 4, 5]})
average = df["A"].apply(lambda x: x.mean())
print(average)

Nesse exemplo, usamos o método apply() para aplicar a função mean() à coluna “A” do DataFrame. O resultado é a média dos valores na coluna “A”.

Ao usar métodos vetorizados, você obtém um código mais eficiente, legível e menos propenso a erros. Além disso, o pandas é projetado para otimizar o desempenho desses métodos vetorizados, o que resultará em uma execução mais rápida do seu código.

Use colunas intermediárias para usar métodos vetorizados

Em alguns casos, pode ser necessário usar colunas intermediárias para aplicar métodos vetorizados. Isso ocorre quando você precisa realizar cálculos complexos ou combinar dados de diferentes colunas.

Por exemplo, digamos que você tenha um DataFrame com as colunas “A” e “B”, e você deseja criar uma nova coluna “C” que é a soma das colunas “A” e “B”. Você pode usar um código como este:

import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
df["C"] = df["A"] + df["B"]
print(df)

Nesse exemplo, criamos uma nova coluna “C” que é a soma das colunas “A” e “B”. Usamos a sintaxe df["C"] para criar a nova coluna e atribuímos a ela a expressão df["A"] + df["B"], que retorna a soma dos valores das colunas “A” e “B”.

Usar colunas intermediárias é uma abordagem eficaz para aproveitar os métodos vetorizados do pandas para realizar cálculos complexos ou criar colunas derivadas. Isso torna o seu código mais eficiente e mais fácil de ler e entender.

Conclusão

Em resumo, embora seja possível iterar sobre as linhas em um DataFrame do pandas, essa abordagem geralmente deve ser evitada devido ao desempenho inferior e à complexidade do código resultante. O pandas é projetado para trabalhar com dados de forma vetorizada, aproveitando métodos eficientes para aplicar operações em larga escala em vez de uma operação de cada vez.

Ao invés de iterar, é recomendado o uso de métodos vetorizados do pandas, como apply(), map(), fillna(), groupby(), merge(), sort_values() e str.contains(), para realizar operações em DataFrames. Esses métodos são mais eficientes, mais fáceis de usar e menos propensos a erros. Além disso, eles são a maneira mais idiomática e otimizada de trabalhar com o pandas.

Ao seguir as práticas recomendadas de uso de métodos vetorizados e evitando a iteração, você poderá aproveitar ao máximo o poder do pandas para manipular e analisar dados de forma eficiente e eficaz.