HOWTO · Pandas

Como iterar pelas linhas de um DataFrame no Pandas

Compare formas de ler ou processar linhas em um DataFrame do pandas, incluindo df.index, loc[], iloc[], iterrows(), itertuples() e apply().

Nesta página

Para cálculos que o pandas pode expressar diretamente, prefira uma operação vetorizada; ela geralmente é mais simples e evita loops de linhas no nível do Python. Quando você precisar de lógica personalizada por linha, escolha a seleção baseada em rótulo ou em posição, ou use um iterador de linhas. Os exemplos usam esta tabela de renda; cada trecho cria seu próprio DataFrame para que possa ser executado de forma independente.

import pandas as pd

df = pd.DataFrame({
    "Date": ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"],
    "Income_1": [10, 20, 10, 15, 10, 12],
    "Income_2": [20, 30, 10, 5, 40, 13],
})

print(df["Income_1"] + df["Income_2"])
0    30
1    50
2    20
3    20
4    50
5    25
dtype: int64

Iterar pelas linhas com df.index

df.index contém os rótulos das linhas. Com o índice padrão neste exemplo, os rótulos vão de 0 a 5, portanto também funcionam como rótulos em df.loc. Um índice personalizado ou não consecutivo altera esses rótulos; não presuma que eles sejam posições das linhas.

import pandas as pd

df = pd.DataFrame({
    "Date": ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"],
    "Income_1": [10, 20, 10, 15, 10, 12],
    "Income_2": [20, 30, 10, 5, 40, 13],
})

for label in df.index:
    row = df.loc[label]
    total = row["Income_1"] + row["Income_2"]
    print(f"Total income in {row['Date']} is: {total}")
Total income in April-10 is: 30
Total income in April-11 is: 50
Total income in April-12 is: 20
Total income in April-13 is: 20
Total income in April-14 is: 50
Total income in April-16 is: 25

Isso lê cada rótulo, seleciona sua linha e soma os dois valores de renda. Para um loop baseado em posição, use iloc[] em vez disso.

Acessar linhas por rótulo com loc[]

Use loc[] quando o seletor de linha for um rótulo de índice. Seu primeiro seletor escolhe a linha e seu segundo escolhe a coluna; os rótulos não precisam ser inteiros.

import pandas as pd

df = pd.DataFrame({
    "Date": ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"],
    "Income_1": [10, 20, 10, 15, 10, 12],
    "Income_2": [20, 30, 10, 5, 40, 13],
})

for label in df.index:
    date = df.loc[label, "Date"]
    total = df.loc[label, "Income_1"] + df.loc[label, "Income_2"]
    print(f"Total income in {date} is: {total}")
Total income in April-10 is: 30
Total income in April-11 is: 50
Total income in April-12 is: 20
Total income in April-13 is: 20
Total income in April-14 is: 50
Total income in April-16 is: 25

Iterar por df.index mantém a busca vinculada aos rótulos reais. Se você já tiver um rótulo, poderá selecionar sua linha diretamente com df.loc[label].

Acessar linhas por posição com iloc[]

Use iloc[] quando você se referir a posições inteiras: seu primeiro seletor é a posição da linha e seu segundo é a posição da coluna. Nesta tabela, as posições de coluna 0, 1 e 2 referem-se a Date, Income_1 e Income_2.

import pandas as pd

df = pd.DataFrame({
    "Date": ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"],
    "Income_1": [10, 20, 10, 15, 10, 12],
    "Income_2": [20, 30, 10, 5, 40, 13],
})

for position in range(len(df)):
    date = df.iloc[position, 0]
    total = df.iloc[position, 1] + df.iloc[position, 2]
    print(f"Total income in {date} is: {total}")
Total income in April-10 is: 30
Total income in April-11 is: 50
Total income in April-12 is: 20
Total income in April-13 is: 20
Total income in April-14 is: 50
Total income in April-16 is: 25

Ao contrário de loc[], iloc[] não interpreta o seletor de linha como um rótulo de índice. Use-o quando a ordem das linhas for o que importa.

Iterar com DataFrame.iterrows()

pandas.DataFrame.iterrows() produz um par para cada linha: seu rótulo de índice e a linha como uma Series. Isso é conveniente quando o código precisa de várias colunas nomeadas, mas pode ser mais lento do que a iteração por tuplas e pode converter os valores para um dtype de linha comum. Evite modificar a linha produzida para atualizar o DataFrame original.

import pandas as pd

df = pd.DataFrame({
    "Date": ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"],
    "Income_1": [10, 20, 10, 15, 10, 12],
    "Income_2": [20, 30, 10, 5, 40, 13],
})

for label, row in df.iterrows():
    total = row["Income_1"] + row["Income_2"]
    print(f"Total income in {row['Date']} is: {total}")
Total income in April-10 is: 30
Total income in April-11 is: 50
Total income in April-12 is: 20
Total income in April-13 is: 20
Total income in April-14 is: 50
Total income in April-16 is: 25

O rótulo está disponível como label; os valores da linha são acessados pelo nome da coluna em row.

Iterar com DataFrame.itertuples()

itertuples() produz uma tupla por linha. Por padrão, o índice é o primeiro campo da tupla, seguido pelos campos das colunas. Campos nomeados como Date e Income_1 fazem desta uma escolha legível para o processamento por linha, e a iteração por tuplas costuma ser preferível a iterrows() quando a iteração é necessária.

import pandas as pd

df = pd.DataFrame({
    "Date": ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"],
    "Income_1": [10, 20, 10, 15, 10, 12],
    "Income_2": [20, 30, 10, 5, 40, 13],
})

for row in df.itertuples():
    total = row.Income_1 + row.Income_2
    print(f"Total income in {row.Date} is: {total}")
Total income in April-10 is: 30
Total income in April-11 is: 50
Total income in April-12 is: 20
Total income in April-13 is: 20
Total income in April-14 is: 50
Total income in April-16 is: 25

Para omitir o campo de índice, passe index=False; para receber tuplas comuns em vez de tuplas nomeadas, passe name=None. Nomes de colunas que não são identificadores Python válidos são renomeados nos campos de tuplas nomeadas, portanto use posições comuns de tupla ou iterrows() quando isso for importante.

Aplicar uma função a cada linha com DataFrame.apply()

DataFrame.apply() pode chamar uma função uma vez por linha com axis=1 (ou axis="columns"). Uma chamada por linha retorna uma Series aqui, com um resultado para cada linha de entrada. Não é o mesmo que computação vetorizada e não é automaticamente mais rápida do que um loop; use-a quando a interface baseada em função for útil.

import pandas as pd

df = pd.DataFrame({
    "Date": ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"],
    "Income_1": [10, 20, 10, 15, 10, 12],
    "Income_2": [20, 30, 10, 5, 40, 13],
})

result = df.apply(
    lambda row: f"Total income in {row['Date']} is: {row['Income_1'] + row['Income_2']}",
    axis=1,
)
print(result.to_string(index=False))
Total income in April-10 is: 30
Total income in April-11 is: 50
Total income in April-12 is: 20
Total income in April-13 is: 20
Total income in April-14 is: 50
Total income in April-16 is: 25

A chamada retorna uma string por linha em result. Para esta adição simples, uma expressão vetorizada como df["Income_1"] + df["Income_2"] é mais direta. Consulte a referência de DataFrame.apply() para os parâmetros do método.