HOWTO · Pandas
Obter Índice de Linhas cuja Coluna Corresponde a Valor Específico em Pandas
Este artigo introduz como obter o índice de linhas cuja coluna corresponde ao valor específico em Pandas.
Nesta página
Para obter as linhas que atendem a uma condição, crie uma máscara booleana e passe-a para DataFrame.loc. Para obter apenas os rótulos dessas linhas, aplique a mesma máscara a DataFrame.index; chame tolist() se precisar de uma lista Python comum. Os rótulos do índice identificam as linhas e não precisam ser posições inteiras consecutivas. Reutilizar a mesma máscara mantém alinhadas a seleção das linhas e a seleção dos rótulos, mesmo quando o DataFrame tem rótulos personalizados. Use DataFrame.loc quando precisar dos registros correspondentes para continuar o trabalho e a expressão do índice quando quiser apenas os rótulos.
Obter linhas que atendem a condições numéricas em Pandas
Este exemplo seleciona as linhas em que a coluna B é igual a 19 e, em seguida, combina essa condição com uma condição OR na coluna C. DataFrame.loc retorna as linhas correspondentes, enquanto DataFrame.index retorna seus rótulos. Os parênteses em torno de cada comparação deixam explícita a condição booleana combinada. Em um DataFrame real, substitua os nomes das colunas e os valores de exemplo pelos dados que você tem; mantenha cada comparação entre parênteses ao combinar máscaras com | ou &, para que o Python aplique a operação pretendida a cada Série booleana.
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))
matches_b = df["B"] == 19
print(df.loc[matches_b])
print(df.index[matches_b].tolist())
matches_b_or_c = (df["B"] == 19) | (df["C"] == 19)
print(df.loc[matches_b_or_c])
print(df.index[matches_b_or_c].tolist())
A B C D
6 1 19 4 18
9 12 19 3 1
[6, 9]
A B C D
6 1 19 4 18
9 12 19 3 1
14 12 15 19 1
[6, 9, 14]
A primeira máscara seleciona as linhas cujo valor de B é 19; seus rótulos são [6, 9]. A segunda máscara usa OR (|), portanto uma linha é selecionada quando B ou C é igual a 19; seus rótulos são [6, 9, 14]. Use & entre condições entre parênteses quando ambas precisarem ser verdadeiras. Esses valores são rótulos do índice, não posições das linhas, então continuam significativos mesmo que o DataFrame tenha sido filtrado ou carregado com um índice personalizado. DataFrame.index é um atributo, não um método, e tolist() converte os rótulos selecionados em uma lista Python sem depender de uma classe específica de índice do pandas. Se os rótulos originais não forem únicos, o resultado poderá conter rótulos repetidos, pois cada linha correspondente contribui com seu rótulo de índice.
Obter índices das linhas correspondentes a valores de texto em Pandas
Filtros de texto seguem o mesmo padrão: compare uma coluna com um valor completo para verificar igualdade exata ou use str.contains para localizar uma substring. A igualdade exata é útil quando todo o conteúdo da célula precisa corresponder; a busca por substring é útil quando o valor pode incluir outros textos. O exemplo abaixo obtém tanto as linhas correspondentes quanto seus rótulos. A condição de substring usa rex em minúsculas, que aparece com a mesma capitalização em Tyrannosaurus rex.
import pandas as pd
df = pd.DataFrame(
{
"Name": ["blue", "delta", "echo", "charlie", "alpha"],
"Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
}
)
exact_name = df["Name"] == "blue"
print(df.index[exact_name].tolist())
print(df.loc[exact_name])
name_contains_ha = df["Name"].str.contains("ha")
print(df.index[name_contains_ha].tolist())
print(df.loc[name_contains_ha])
name_contains_ha_and_type_contains_rex = name_contains_ha & df["Type"].str.contains("rex")
print(df.loc[name_contains_ha_and_type_contains_rex])
[0]
Name Type
0 blue Raptors
[3, 4]
Name Type
3 charlie Raptors
4 alpha Tyrannosaurus rex
Name Type
4 alpha Tyrannosaurus rex
A igualdade exata encontra blue e retorna seu rótulo. A substring ha corresponde a charlie e alpha; ao combiná-la com a condição rex na coluna Type, a linha alpha é selecionada e seu rótulo é [4]. Por padrão, str.contains diferencia maiúsculas de minúsculas; portanto, use a mesma capitalização dos dados ou defina a opção case explicitamente. Combine condições com & quando ambas precisarem corresponder e com | quando qualquer uma delas puder corresponder; coloque cada comparação entre parênteses. Assim como nos filtros numéricos, passe a máscara para DataFrame.loc para obter as linhas e para DataFrame.index para obter os rótulos. Você pode adaptar a expressão de correspondência exata a outra coluna alterando o nome da coluna e o valor comparado; a expressão de substring mantém a mesma estrutura, mas usa outro texto de busca.