python - iloc - pandas series example
Python: Pandas Series-¿Por qué usar loc? (1)
¿Por qué usamos ''loc'' para los marcos de datos de pandas? parece que el siguiente código con o sin usar loc compila y ejecuta a una velocidad simulular
%timeit df_user1 = df.loc[df.user_id==''5561'']
100 loops, best of 3: 11.9 ms per loop
o
%timeit df_user1_noloc = df[df.user_id==''5561'']
100 loops, best of 3: 12 ms per loop
Entonces, ¿por qué usar loc?
Editar: Esto se ha marcado como una pregunta duplicada. Pero aunque pandas iloc vs ix vs loc explicación? menciona que *
puede hacer la recuperación de columnas simplemente usando el elemento get del marco de datos :
* *
df[''time''] # equivalent to df.loc[:, ''time'']
no dice por qué usamos loc, aunque explica muchas características de loc, mi pregunta específica es ''¿por qué no simplemente omitir loc por completo''? para lo cual he aceptado una respuesta muy detallada a continuación.
Además, esa otra publicación la respuesta (que no creo que sea una respuesta) está muy oculta en la discusión y cualquier persona que busque lo que estaba buscando tendría dificultades para localizar la información y la respuesta proporcionada sería mucho mejor. a mi pregunta
-
Explícito es mejor que implícito.
df[boolean_mask]selecciona filas dondeboolean_maskes True, pero hay un caso de esquina cuando es posible que no desee: cuandodftiene etiquetas de columna con valores booleanos:In [229]: df = pd.DataFrame({True:[1,2,3],False:[3,4,5]}); df Out[229]: False True 0 3 1 1 4 2 2 5 3Es posible que desee utilizar
df[[True]]para seleccionar la columnaTrue. En cambio, plantea unValueError:In [230]: df[[True]] ValueError: Item wrong length 1 instead of 3.Contra el uso de
loc:In [231]: df.loc[[True]] Out[231]: False True 0 3 1Por el contrario, lo siguiente no
ValueErrora pesar de que la estructura dedf2es casi la misma quedf1anterior:In [258]: df2 = pd.DataFrame({''A'':[1,2,3],''B'':[3,4,5]}); df2 Out[258]: A B 0 1 3 1 2 4 2 3 5 In [259]: df2[[''B'']] Out[259]: B 0 3 1 4 2 5Por lo tanto,
df[boolean_mask]no siempre se comporta igual quedf.loc[boolean_mask]. Aunque este es posiblemente un caso de uso improbable, recomendaría usar siempredf.loc[boolean_mask]lugar dedf[boolean_mask]porque el significado de la sintaxis dedf.loces explícito. Condf.loc[indexer]usted sabe automáticamente quedf.locestá seleccionando filas. Por el contrario, no está claro sidf[indexer]seleccionará filas o columnas (o aumentaráValueError) sin conocer detalles sobreindexerydf. -
df.loc[row_indexer, column_index]puede seleccionar filas y columnas.df[indexer]solo puede seleccionar filas o columnas según el tipo de valores en elindexery el tipo de valores de columna que tienedf(de nuevo, ¿son booleanos?).In [237]: df2.loc[[True,False,True], ''B''] Out[237]: 0 3 2 5 Name: B, dtype: int64 -
Cuando se pasa un segmento a
df.loclos puntos finales se incluyen en el rango. Cuando se pasa un segmento adf[...], el segmento se interpreta como un intervalo medio abierto:In [239]: df2.loc[1:2] Out[239]: A B 1 2 4 2 3 5 In [271]: df2[1:2] Out[271]: A B 1 2 4