HOWTO · Pandas

Ottieni l'indice delle righe la cui colonna corrisponde a un valore specifico in Pandas

Questo articolo introduce come ottenere l'indice delle righe la cui colonna corrisponde al valore specifico in Pandas.

In questa pagina

Per recuperare le righe che soddisfano una condizione, crea una maschera booleana e passala a DataFrame.loc. Per ottenere solo le relative etichette, applica la stessa maschera a DataFrame.index; chiama tolist() se ti serve una normale lista Python. Le etichette dell’indice identificano le righe e non devono necessariamente coincidere con posizioni intere consecutive. Riutilizzare la stessa maschera mantiene allineate la selezione delle righe e quella delle etichette, anche quando un DataFrame usa etichette personalizzate. Scegli DataFrame.loc quando ti servono i record corrispondenti per elaborarli ulteriormente; usa l’espressione con l’indice quando il risultato desiderato è costituito dalle etichette stesse.

Selezionare righe che soddisfano condizioni numeriche in Pandas

Questo esempio seleziona le righe in cui la colonna B è uguale a 19, quindi combina questa condizione con una condizione OR sulla colonna C. DataFrame.loc restituisce le righe corrispondenti, mentre DataFrame.index ne restituisce le etichette. Le parentesi attorno a ogni confronto rendono esplicita la condizione booleana combinata. In un DataFrame reale, sostituisci i nomi delle colonne e i valori di esempio con quelli dei tuoi dati; quando combini maschere con | o &, racchiudi ogni confronto tra parentesi affinché Python applichi l’operazione prevista a ciascuna Series 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]

La prima maschera seleziona le righe in cui il valore di B è 19; le relative etichette sono [6, 9]. La seconda maschera usa OR (|), quindi seleziona una riga se B oppure C è uguale a 19; le etichette sono [6, 9, 14]. Usa & tra condizioni racchiuse tra parentesi quando devono essere vere entrambe. Questi valori sono etichette dell’indice, non posizioni delle righe: possono quindi restare significativi anche se il DataFrame è stato filtrato o caricato con un indice personalizzato. DataFrame.index è un attributo, non un metodo, e tolist() converte le etichette selezionate in una lista Python senza dipendere da una specifica classe di indice di pandas. Se le etichette originali non sono univoche, il risultato può contenerne di ripetute, perché ogni riga corrispondente contribuisce con la propria etichetta dell’indice.

Ottenere gli indici delle righe corrispondenti a stringhe in Pandas

I filtri sulle stringhe seguono lo stesso schema: confronta una colonna con un valore completo per verificare l’uguaglianza esatta, oppure usa str.contains per cercare una sottostringa. L’uguaglianza esatta è utile quando deve corrispondere l’intero valore della cella; la ricerca di una sottostringa serve quando il valore può contenere anche altro testo. L’esempio seguente recupera sia le righe corrispondenti sia le relative etichette. La condizione sulla sottostringa usa rex in minuscolo, che compare con la stessa maiuscolazione in 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

L’uguaglianza esatta trova blue e restituisce la relativa etichetta. La sottostringa ha corrisponde a charlie e alpha; combinandola con la condizione rex sulla colonna Type, viene selezionata la riga alpha, la cui etichetta è [4]. Per impostazione predefinita, str.contains distingue tra maiuscole e minuscole: adegua quindi la ricerca alla capitalizzazione dei dati oppure imposta esplicitamente l’opzione case. Combina le condizioni con & quando devono corrispondere entrambe e con | quando può bastare una delle due; racchiudi ogni confronto tra parentesi. Come per i filtri numerici, passa la maschera a DataFrame.loc per ottenere le righe e a DataFrame.index per ottenere le etichette. Puoi adattare l’espressione di corrispondenza esatta a un’altra colonna cambiando il nome della colonna e il valore di confronto; la forma con la sottostringa mantiene la stessa struttura e richiede soltanto un termine di ricerca diverso.