• analiticas
  • Posts
  • Filtrare un set di dati con il metodo query()

Filtrare un set di dati con il metodo query()

Aspetta... è Python o SQL?

Filtrare i dati è un’operazione molto comune quando ci si appresta ad analizzarli. In questa micro-lezione vedremo come farlo usando il metodo query().

Python o SQL?

Se hai una qualche familiarità con SQL, molto probabilmente il metodo query() ti piacerà. Infatti, ci permette di selezionare i dati che corrispondono a determinati criteri con una sintassi simile a quella di SQL.

Vediamo insieme alcuni esempi.

Selezionare stringhe di testo uguali a …

Immagina di voler selezionare tutte le righe di un dataframe che contengono “Roma” in una determinata colonna. Ecco come fare con il metodo query() :

df.query("colonna1 == 'Roma'")

Ci sono due cose importanti a cui prestare attenzione:

  • Le virgolette: le virgolette del metodo query() e quelle che indicano il valore che vogliamo usare per filtrare il nostro dataframe devono essere di tipo diverso.

  • Il simbolo dell’uguale: ricorda che in Python il doppio uguale (==) indica uguaglianza. Il simbolo dell’uguale semplice (=) è invece utilizzato per assegnare un valore a qualcosa.

Selezionare i valori di una lista

In questo esempio, immaginiamo di voler selezionare le righe di un dataframe solo se i valori di una colonna sono tra quelli di una lista.

Se vogliamo esplicitare la lista direttamente all’interno del motodo query(), possiamo fare così:

df.query("colonna1 in ('Roma', 'Milano', 'Napoli', Venezia'")

Se invece, magari per evitare ripetizioni, preferiamo fare riferimento ad una lista citata in precedenza, possiamo fare così:

lista = ('Roma', 'Milano', 'Napoli', 'Venezia')

df.query("colonna1 in @lista")

Infatti, in questo caso stiamo utilizzando l’operatore “@” che fa riferimento ad una variabile (nel nostro caso, la lista).

Importante: Il metodo query() esige che “in” sia scritto in minuscolo.

Selezionare i valori non inclusi in una lista

In maniera simile all’esempio precedente, immaginiamo di voler escludere dalla nostra selezione i valori di una lista.

Anche in questo caso, possiamo esplicitare la lista nel metodo query():

df.query("colonna1 not in ('Roma', 'Milano', 'Napoli', Venezia'")

Oppure, possiamo fare riferimento ad una lista già introdotta in precedenza:

lista = ('Roma', 'Milano', 'Napoli', 'Venezia')

df.query("colonna1 not in @lista")

Importante: Il metodo query() esige che “not in” sia scritto in minuscolo.

Selezionare valori numerici

Il metodo query() funziona anche con colonne che contengono valori numerici. Ecco alcuni esempi:

# selezionare le righe della colonna2 con valori uguali a 0
df.query("colonna2 ==  0")

# selezionare le righe della colonna2 con valori maggiori di 5
df.query("colonna2 >  5")

# selezionare le righe della colonna2 con valori minori o uguali a 100
df.query("colonna2 <=  100")

Combinare più criteri

Il metodo query() ci permette di combinare diversi filtri per selezionare i nostri dati. Per farlo, bisogna separarli con le congiunzioni “and” (in italiano: e) e “or” (in italiano: o), proprio come avviene in SQL.

Vediamo qualche esempio:

lista = ('Roma', 'Milano', 'Napoli', 'Venezia')

df.query("colonna1 not in @lista and colonna2 >  0")

In questo caso per esempio, andremo a selezionare solo le righe in cui il valore della colonna1 non è incluso nella lista e quello della colonna2 è maggiore di 0.

Vediamo un esempio più complesso in cui useremo sia “and” che “or”:

lista = ('Roma', 'Milano', 'Napoli', 'Venezia')

df.query("colonna1 in @lista and (colonna2 < 75 or colonna3 == 'Mario')")

In questo caso, è importantissimo l’ordine delle parentesi per stabilire le relazioni fra le congiunzioni “and” e “or”.

Importante: Il metodo query() esige che “and” e “or” siano scritti in minuscolo.

Conclusione

Il metodo query(), grazie alla sua semplicità ed eleganza, è la scelta perfetta per filtrare i nostri dati: non è soltanto efficace, ma si dimostra facilmente leggibile.

Se condividi le tue analisi con amici e/o colleghi, usarlo sarà una scelta che risulterà gradita.

Alla prossima micro-lezione 👋