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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow