pandas
Indexación booleana de marcos de datos
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