funcion - Selección con.loc en python
pandas select rows (4)
Es un marco de datos de pandas y usa la herramienta de selección de base de etiquetas con df.loc y en él, hay dos entradas, una para la fila y otra para la columna, por lo que en la entrada de la fila está seleccionando todos esos valores de fila donde el valor guardado en la columna ''clase'' es ''versicolor'', y en la entrada de la columna está seleccionando la columna con la etiqueta ''clase'', y asignándoles un valor de ''Iris-versicolor''. Así que básicamente está reemplazando todas las celdas de la columna ''clase'' con el valor ''versicolor'' con ''Iris-versicolor''.
Vi este código en el cuaderno de iPython de alguien, y estoy muy confundido sobre cómo funciona este código. Por lo que entendí, pd.loc [] se utiliza como un indexador basado en la ubicación donde el formato es:
df.loc[index,column_name]
Sin embargo, en este caso, el primer índice parece ser una serie de valores booleanos. ¿Podría alguien explicarme cómo funciona esta selección? Intenté leer la documentación pero no pude encontrar una explicación. ¡Gracias!
iris_data.loc[iris_data[''class''] == ''versicolor'', ''class''] = ''Iris-versicolor''
Es una selección basada en la etiqueta de pandas
, como se explica aquí: https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label
La matriz booleana es básicamente un método de selección que utiliza una máscara.
Esto es usar los marcos de datos del paquete pandas
. La parte de "índice" puede ser un índice único, una lista de índices o una lista de valores booleanos. Se puede leer sobre esto en la documentación: https://pandas.pydata.org/pandas-docs/stable/indexing.html
Por lo tanto, la parte del index
especifica un subconjunto de las filas a extraer, y el nombre de columna (opcional) especifica la columna con la que desea trabajar desde ese subconjunto del marco de datos. Entonces, si desea actualizar la columna ''clase'' pero solo en las filas donde la clase está configurada actualmente como ''versicolor'', puede hacer algo como lo que enumera en la pregunta:
iris_data.loc[iris_data[''class''] == ''versicolor'', ''class''] = ''Iris-versicolor''
pd.DataFrame.loc
puede tomar uno o dos indexadores. Para el resto de la publicación, representaré el primer indexador como i
y el segundo indexador como j
.
Si solo se proporciona un indexador, se aplica al índice del marco de datos y se supone que el indexador faltante representa todas las columnas. Así que los siguientes dos ejemplos son equivalentes.
-
df.loc[i]
-
df.loc[i, :]
Donde :
se utiliza para representar todas las columnas.
Si ambos indizadores están presentes, i
referencia a valores de índice y j
referencia a valores de columna.
Ahora podemos centrarnos en qué tipos de valores i
y j
pueden asumir. Usemos el siguiente marco de datos df
como nuestro ejemplo:
df = pd.DataFrame([[1, 2], [3, 4]], index=[''A'', ''B''], columns=[''X'', ''Y''])
loc
ha sido escrito de tal manera que i
y j
pueden ser
Scalars que deberían ser valores en los respectivos objetos de índice.
df.loc[''A'', ''Y''] 2
matrices cuyos elementos también son miembros del objeto de índice respectivo (observe que se respeta el orden de la matriz que paso a
loc
df.loc[[''B'', ''A''], ''X''] B 3 A 1 Name: X, dtype: int64
Observe la dimensionalidad del objeto de retorno al pasar matrices.
i
es una matriz como estaba arriba,loc
devuelve un objeto en el que se devuelve un índice con esos valores. En este caso, comoj
era un escalar,loc
devolvió un objetopd.Series
. Podríamos haber manipulado esto para devolver un marco de datos si pasáramos una matriz parai
yj
, y la matriz podría haber sido solo una matriz con un solo valor.df.loc[[''B'', ''A''], [''X'']] X B 3 A 1
matrices booleanas cuyos elementos son
True
oFalse
y cuya longitud coincide con la longitud del índice respectivo. En este caso,loc
simplemente toma las filas (o columnas) en las que la matriz booleana esTrue
.df.loc[[True, False], [''X'']] X A 1
Además de los indexadores que puede pasar a loc
, también le permite realizar asignaciones. Ahora podemos desglosar la línea de código que proporcionó.
iris_data.loc[iris_data[''class''] == ''versicolor'', ''class''] = ''Iris-versicolor''
-
iris_data[''class''] == ''versicolor''
devuelve una matriz booleana. -
class
es un escalar que representa un valor en el objeto de columnas. -
iris_data.loc[iris_data[''class''] == ''versicolor'', ''class'']
devuelve un objetopd.Series
que consiste en la columna''class''
para todas las filas donde''class''
es''versicolor''
Cuando se usa con un operador de asignación:
iris_data.loc[iris_data[''class''] == ''versicolor'', ''class''] = ''Iris-versicolor''
Asignamos
''Iris-versicolor''
para todos los elementos en la columna''class''
donde''class''
era''versicolor''