pandas
Indicizzazione booleana dei dataframes
Ricerca…
introduzione
Accedere alle righe in un dataframe utilizzando gli oggetti .ix
.loc
.ix
, .loc
, .iloc
e in che modo si differenzia dall'uso di una maschera booleana.
Accesso a un DataFrame con un indice booleano
Questo sarà il nostro esempio di dati:
df = pd.DataFrame({"color": ['red', 'blue', 'red', 'blue']},
index=[True, False, True, False])
color
True red
False blue
True red
False blue
Accedere con .loc
df.loc[True]
color
True red
True red
Accedere con .iloc
df.iloc[True]
>> TypeError
df.iloc[1]
color blue
dtype: object
È importante notare che le versioni precedenti dei panda non distinguevano tra input booleano e intero, quindi
.iloc[True]
restituirebbe lo stesso di.iloc[1]
Accesso con .ix
df.ix[True]
color
True red
True red
df.ix[1]
color blue
dtype: object
Come puoi vedere, .ix
ha due comportamenti. Questa è una pessima pratica nel codice e quindi dovrebbe essere evitata. Si prega di utilizzare .iloc
o .loc
per essere più espliciti.
Applicazione di una maschera booleana ad un dataframe
Questo sarà il nostro esempio di dati:
color name size
0 red rose big
1 blue violet big
2 red tulip small
3 blue harebell small
Usando l' __getitem__
magico __getitem__
o []
. Dandogli una lista di True e False della stessa lunghezza del dataframe ti darà:
df[[True, False, True, False]]
color name size
0 red rose big
2 red tulip small
Mascheramento dei dati in base al valore della colonna
Questo sarà il nostro esempio di dati:
color name size
0 red rose big
1 blue violet small
2 red tulip small
3 blue harebell small
Accedendo a una singola colonna da un frame di dati, possiamo usare un semplice confronto ==
per confrontare ogni elemento della colonna con la variabile data, producendo un pd.Series
di True e False
df['size'] == 'small'
0 False
1 True
2 True
3 True
Name: size, dtype: bool
Questo pd.Series
è un'estensione di un np.array
che è un'estensione di un list
semplice, quindi possiamo __getitem__
o []
come nell'esempio precedente.
size_small_mask = df['size'] == 'small'
df[size_small_mask]
color name size
1 blue violet small
2 red tulip small
3 blue harebell small
Mascherare i dati in base al valore dell'indice
Questo sarà il nostro esempio di dati:
color size
name
rose red big
violet blue small
tulip red small
harebell blue small
Possiamo creare una maschera basata sui valori dell'indice, proprio come su un valore di colonna.
rose_mask = df.index == 'rose'
df[rose_mask]
color size
name
rose red big
Ma farlo è quasi lo stesso di
df.loc['rose']
color red
size big
Name: rose, dtype: object
La differenza importante è che, quando .loc
incontra solo una riga nell'indice che corrisponde, restituirà un pd.Series
, se incontra più righe corrispondenti, restituirà un pd.DataFrame
. Questo rende questo metodo piuttosto instabile.
Questo comportamento può essere controllato dando a .loc
un elenco di una singola voce. Questo lo costringerà a restituire un frame di dati.
df.loc[['rose']]
color size
name
rose red big