Obter Índice de Linhas cuja Coluna Corresponde a Valor Específico em Pandas

Sathiya Sarathi 30 janeiro 2023
  1. Obter Índices de Linhas contendo números inteiros/flutuantes em Pandas
  2. Obter Índices de Linhas contendo Strings em Pandas
Obter Índice de Linhas cuja Coluna Corresponde a Valor Específico em Pandas

Este artigo demonstra como obter o índice de linhas cuja coluna corresponde a certos critérios em Pandas.

A necessidade de encontrar os índices das filas é importante na engenharia de características. Estas competências podem ser úteis para remover os valores anómalos ou anómalos de um Quadro de Dados. Os índices, também conhecidos como os rótulos das linhas, podem ser encontrados em Pandas, utilizando várias funções. Nos exemplos seguintes, iremos trabalhar no dataframe criado usando o seguinte trecho.

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df)

Resultado:

     A   B   C   D
0   13  16   1   4
1    4   8  10  19
2    5   7  13   2
3    7   8  15  18
4    6  14   9  10
5   17   6  16  16
6    1  19   4  18
7   15   8   1   2
8   10   1  11   4
9   12  19   3   1
10   1   5   6   7
11   9  18  16   5
12  10  11   2   2
13   8  10   4   7
14  12  15  19   1
15  15   4  13  11
16  12   5   7   5
17  16   4  13   5
18   9  15  16   4
19  16  14  17  18

Obter Índices de Linhas contendo números inteiros/flutuantes em Pandas

A função pandas.DataFrame.loc pode aceder a linhas e colunas pelas suas etiquetas/nomes. É directamente para a frente ao devolver as linhas que correspondem à condição booleana passada como uma etiqueta. Repare nos parênteses rectos ao lado de df.loc no snippet.

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df.loc[df["B"] == 19])

As linhas correspondentes à condição booleana são devolvidas como uma saída no formato de um Dataframe.

Resultado:

    A   B  C   D
6   1  19  4  18
9  12  19  3   1

Múltiplas condições podem ser encadeadas e aplicadas em conjunto à função, como se mostra abaixo. Isto ajuda a isolar as filas com base em condições específicas.

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df.loc[(df["B"] == 19) | (df["C"] == 19)])

Resultado:

     A   B   C   D
6    1  19   4  18
9   12  19   3   1
14  12  15  19   1

Obter índice de linhas com pandas.DataFrame.index()

Se quiser encontrar apenas os índices correspondentes do dataframe que satisfazem a condição booleana passada como argumento, pandas.DataFrame.index() é a forma mais fácil de o conseguir.

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df.index[df["B"] == 19].tolist())

No trecho acima, as linhas da coluna A que correspondem à condição booleana == 1 são devolvidas como saída, como se mostra abaixo.

Resultado:

[6, 9]

A razão pela qual colocamos tolist() atrás do método index() é para converter o Index para a lista; caso contrário, o resultado é do tipo de dados Int64Index.

Int64Index([6, 9], dtype='int64'

A recuperação apenas dos índices também pode ser feita com base em múltiplas condições. O trecho pode ser escrito da seguinte forma:

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df.index[(df["B"] == 19) | (df["C"] == 19)].tolist())

Resultado:

[6, 9, 14]

Obter Índices de Linhas contendo Strings em Pandas

Os valores das strings podem ser combinados com base em dois métodos. Ambos os métodos mostrados na secção anterior funcionarão, excepto no que diz respeito à alteração da condição.

Nos exemplos que se seguem, utilizaremos o seguinte trecho.

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["blue", "delta", "echo", "charlie", "alpha"],
        "Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
    }
)

print(df)

Resultado:

      Name               Type
0     blue            Raptors
1    delta            Raptors
2     echo            Raptors
3  charlie            Raptors
4    alpha  Tyrannosaurus rex

Obter Índice de Linhas com a Correspondência Exacta da String

A condição de igualdade utilizada na secção anterior pode ser utilizada para encontrar a correspondência exacta da string no Dataframe. Iremos procurar as duas strings.

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["blue", "delta", "echo", "charlie", "alpha"],
        "Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
    }
)

print(df.index[(df["Name"] == "blue")].tolist())
print("\n")
print(df.loc[df["Name"] == "blue"])
print("\n")
print(df.loc[(df["Name"] == "charlie") & (df["Type"] == "Raptors")])

Resultado:

[0]

   Name     Type
0  blue  Raptors

      Name     Type
3  charlie  Raptors

Como se viu acima, tanto o índice como as linhas que coincidem com a condição podem ser recebidos.

Obter o Índice de Linhas com a Correspondência Parcial de Strings

Os valores das strings podem ser parcialmente combinados encadeando o quadro de dados com a função str.contains. No exemplo seguinte, vamos procurar a string ha em charlie e alpha*.

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["blue", "delta", "echo", "charlie", "alpha"],
        "Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
    }
)

print(df.index[df["Name"].str.contains("ha")].tolist())
print("\n")
print(df.loc[df["Name"].str.contains("ha")])
print("\n")
print(df.loc[(df["Name"].str.contains("ha")) & (df["Type"].str.contains("Rex"))])

Resultado:

[3, 4]

      Name               Type
3  charlie            Raptors
4    alpha  Tyrannosaurus rex


    Name               Type
4  alpha  Tyrannosaurus rex

Esta função pode ser muito útil na execução de uma correspondência parcial de string através de múltiplas colunas do dataframe.

Artigo relacionado - Pandas DataFrame

Artigo relacionado - Pandas DataFrame Row