La selezioni di viste da un dataframe è cosa basilare per un Data Scientist. L’altro giorno al lavoro ho però incontrato una situazione spinosa:
selezionare dati da un dataframe multi-indice con maschera booleana e con specifico valore in indice.
La soluzione è il metodo pandas.DataFrame.query()
Vediamo un esempio pratico. Il nostro input è:
import pandas as pd index = pd.MultiIndex.from_product([['xy1','xy2','xy3'], ['1','2','3','4','5']], names=['Tag', 'Page']) df = pd.DataFrame([1,1,1,4,5,1,1,61,4,51,1,1,4,5,1], index, columns=['Value'])
mentre ciò che vogliamo ottenere è questo:
index2 = pd.MultiIndex.from_product([['1','2','3']], names=['Page']) df2 = pd.DataFrame([1,1,1], index2, columns=['Value']) df2
Usando pandas.DataFrame.query() possiamo risolvere il dilemma in molto molto pythoniano:
df1 = df.query("Tag == 'xy1' & Value == 1").reset_index(level=0, drop=True)
(il .reset_index() è utilizzato per resettare l’indice e ottenere il risultato cosmetico voluto)