¿Cómo cortar un marco de datos de pandas por posición?

2 minutos de lectura

avatar de usuario de tortuga
tortuga

Tengo un objeto Pandas Data Frame que tiene 1000 filas y 10 columnas. Simplemente me gustaría dividir el marco de datos y tomar las primeras 10 filas. ¿Cómo puedo hacer esto? He estado tratando de usar esto:

>>> df.shape
(1000,10)
>>> my_slice = df.ix[10,:]
>>> my_slice.shape
(10,)

¿No debería my_slice ser las primeras diez filas, es decir. un marco de datos de 10 x 10? ¿Cómo puedo obtener las primeras diez filas, de modo que my_slice Qué es un objeto de marco de datos de 10×10? Gracias.

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.head.html?highlight=head#pandas.DataFrame.head

df2 = df.head(10)

debería hacer el truco

También puede hacer como una conveniencia:

df[:10]

  • Esto parece no copiar los nombres de las columnas para mí.

    – Rubén

    23 de agosto de 2021 a las 12:14

Avatar de usuario de Gonçalo Peres
gonzalo peres

Hay varias formas de hacerlo. A continuación, veremos al menos tres opciones.

Para mantener la trama de datos original dfestaremos asignando el marco de datos dividido a df_new.

Al final, en la sección Comparación de tiempo mostraremos, utilizando un marco de datos aleatorio, los distintos tiempos de ejecución.


Opción 1

df_new = df[:10] # Option 1.1

# or

df_new = df[0:10] # Option 1.2

opcion 2

Usando head

df_new = df.head(10)

Para valores negativos de n, esta función devuelve todas las filas excepto las últimas n filas, equivalente a df[:-n] [Source].


Opción 3

Usando iloc

df_new = df.iloc[:10] # Option 3.1

# or

df_new = df.iloc[0:10] # Option 3.2

Comparación de tiempo

Para este caso específico se ha utilizado time.perf_counter() para medir el tiempo de ejecución.

       method                   time
0  Option 1.1 0.00000120000913739204
1  Option 1.2 0.00000149995321407914
2    Option 2 0.00000170001294463873
3  Option 3.1 0.00000120000913739204
4  Option 3.2 0.00000350002665072680

ingrese la descripción de la imagen aquí

Como hay varias variables que pueden afectar el tiempo de ejecución, esto puede cambiar según el marco de datos utilizado y más.


Notas:

  • En lugar de 10 uno puede reemplazar las operaciones anteriores con el número de filas que desee. Por ejemplo

    df_new = df[:5]
    

    devolverá un marco de datos con el primero 5 filas

  • Hay formas adicionales de medir el tiempo de ejecución. Para formas adicionales, lea esto: ¿Cómo obtengo el tiempo de ejecución de un programa de Python?

  • También se pueden ajustar las opciones anteriores a una función lambda, como la siguiente

    df_new = df.apply(lambda x: x[:10])
    
    # or
    
    df_new = df.apply(lambda x: x.head(10))
    

    Tenga en cuenta, sin embargo, que hay fuertes opiniones sobre el uso de .apply() y, para este caso, está lejos de ser un método obligatorio.

df.ix[10,:] le da todas las columnas de la fila 10. En su caso, quiere todo hasta la fila 10, que es df.ix[:9,:]. Tenga en cuenta que el extremo derecho del rango de división es inclusivo: http://pandas.sourceforge.net/gotchas.html#endpoints-are-inclusive

Avatar de usuario de Shifu
Shifu

DataFrame[:n] devolverá las primeras n filas.

¿Ha sido útil esta solución?