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