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_mask
es True, pero hay un caso de esquina cuando es posible que no desee: cuandodf
tiene 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 3
Es 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 1
Por el contrario, lo siguiente no
ValueError
a pesar de que la estructura dedf2
es casi la misma quedf1
anterior: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 5
Por 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.loc
es explícito. Condf.loc[indexer]
usted sabe automáticamente quedf.loc
está seleccionando filas. Por el contrario, no está claro sidf[indexer]
seleccionará filas o columnas (o aumentaráValueError
) sin conocer detalles sobreindexer
ydf
. -
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 elindexer
y 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.loc
los 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