Pregunta Python: Serie Pandas - ¿Por qué usar loc?


¿Por qué usamos 'loc' para los cuadros de datos de los pandas? parece que el siguiente código con o sin usar loc compila y funciona 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 ha sido marcado como una pregunta duplicada. Pero aunque pandas iloc vs ix vs explicación loc? menciona eso *

puede hacer la recuperación de columnas simplemente usando los marcos de datos    obtiene el objeto:

*

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'? por lo que acepté una respuesta muy detallada a continuación.

También 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 encontraría difícil localizar la información y la respuesta proporcionada le serviría mucho mejor. a mi pregunta


32
2017-08-11 01:51


origen


Respuestas:


  • Explícito es mejor que implícito.

    df[boolean_mask] selecciona filas donde boolean_mask es verdadero, pero hay un caso de esquina en el que es posible que no lo 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 el True columna. En cambio, plantea un ValueError:

    In [230]: df[[True]]
    ValueError: Item wrong length 1 instead of 3.
    

    En comparación con el uso loc:

    In [231]: df.loc[[True]]
    Out[231]: 
       False  True 
    0      3      1
    

    Por el contrario, lo siguiente no aumenta ValueError a pesar de que la estructura de df2 es casi lo mismo que df1 encima:

    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
    

    Así, df[boolean_mask] no siempre se comporta igual df.loc[boolean_mask]. Aunque este es posiblemente un caso de uso improbable, recomendaría siempre usar df.loc[boolean_mask] en lugar de df[boolean_mask] porque el significado de df.locLa sintaxis es explícita. Con df.loc[indexer] sabes 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 indexer y el tipo de valores de columna df tiene (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 una rebanada a df.loc los puntos finales están incluidos en el rango. Cuando se pasa una rebanada a df[...], el corte 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
    

34
2017-08-11 02:08