name iloc example columns column and python pandas series loc

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 donde boolean_mask es True, pero hay un caso de esquina cuando es posible que no desee: cuando df 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 columna True . En cambio, plantea un ValueError :

    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 de df2 es casi la misma que df1 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 que df.loc[boolean_mask] . Aunque este es posiblemente un caso de uso improbable, recomendaría usar siempre df.loc[boolean_mask] lugar de df[boolean_mask] porque el significado de la sintaxis de df.loc es explícito. Con df.loc[indexer] usted sabe automáticamente que df.loc está seleccionando filas. Por el contrario, no está claro si df[indexer] seleccionará filas o columnas (o aumentará ValueError ) sin conocer detalles sobre indexer y df .

  • 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 el indexer y el tipo de valores de columna que tiene df (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 a df[...] , 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