Buscar..


Introducción

Acceso a las filas en un marco de datos utilizando los objetos del indexador .ix , .loc , .iloc y cómo se diferencia de usar una máscara booleana.

Accediendo a un DataFrame con un índice booleano

Este será nuestro marco de datos de ejemplo:

df = pd.DataFrame({"color": ['red', 'blue', 'red', 'blue']},
                  index=[True, False, True, False])
      color
True    red
False  blue
True    red
False  blue

Accediendo con .loc

df.loc[True]
     color
True   red
True   red

Accediendo con .iloc

df.iloc[True]
>> TypeError

df.iloc[1]
color    blue
dtype: object

Es importante tener en cuenta que las versiones anteriores de los pandas no distinguían entre la entrada booleana y la de enteros, por lo que .iloc[True] devolvería lo mismo que .iloc[1]

Accediendo con .ix

df.ix[True]
     color
True   red
True   red

df.ix[1]
color    blue
dtype: object

Como puedes ver, .ix tiene dos comportamientos. Esta es una muy mala práctica en el código y, por lo tanto, debe evitarse. Por favor use .iloc o .loc para ser más explícito.

Aplicar una máscara booleana a un marco de datos

Este será nuestro marco de datos de ejemplo:

  color      name   size
0   red      rose    big
1  blue    violet    big
2   red     tulip  small
3  blue  harebell  small

Usando el __getitem__ mágico __getitem__ o [] . Dándole una lista de Verdadero y Falso de la misma longitud que el marco de datos le dará:

df[[True, False, True, False]]
  color   name   size
0   red   rose    big
2   red  tulip  small

Datos de enmascaramiento basados ​​en el valor de la columna

Este será nuestro marco de datos de ejemplo:

  color      name   size
0   red      rose    big
1  blue    violet  small
2   red     tulip  small
3  blue  harebell  small

Accediendo a una sola columna desde un marco de datos, podemos usar una comparación simple == para comparar cada elemento de la columna con la variable dada, produciendo un pd.Series de Verdadero y Falso

df['size'] == 'small'
0    False
1     True
2     True
3     True
Name: size, dtype: bool

Esta pd.Series es una extensión de un np.array que es una extensión de una list simple. Por lo tanto, podemos entregar esto al __getitem__ o [] accessor como en el ejemplo anterior.

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

Datos de enmascaramiento basados ​​en el valor del índice

Este será nuestro marco de datos de ejemplo:

         color   size
name                 
rose       red    big
violet    blue  small
tulip      red  small
harebell  blue  small

Podemos crear una máscara basada en los valores del índice, al igual que en un valor de columna.

rose_mask = df.index == 'rose'
df[rose_mask]
     color size
name           
rose   red  big

Pero hacer esto es casi lo mismo que

df.loc['rose']
color    red
size     big
Name: rose, dtype: object

La diferencia importante es que cuando .loc solo encuentra una fila en el índice que coincide, devolverá un pd.Series , si encuentra más filas que coinciden, devolverá un pd.DataFrame . Esto hace que este método sea bastante inestable.

Este comportamiento puede controlarse dando a .loc una lista de una sola entrada. Esto lo obligará a devolver un marco de datos.

df.loc[['rose']]
         color   size
name                 
rose       red    big


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow