HOWTO · Pandas

Cómo barajar aleatoriamente filas de DataFrame en Pandas

Baraja todas las filas de un DataFrame con pandas.DataFrame.sample(), numpy.random.permutation() de NumPy o sklearn.utils.shuffle() de scikit-learn.

En esta página

Para reordenar todas las filas de un DataFrame de pandas, llama a sample(frac=1). El argumento frac solicita una muestra que incluya el conjunto completo de filas, y axis=0 selecciona las filas (es el valor predeterminado). El muestreo devuelve un DataFrame nuevo; no reorganiza el objeto original. El orden es aleatorio, así que distintas llamadas pueden producir disposiciones diferentes. Con el comportamiento de muestreo predeterminado, cada fila de origen aparece una vez y los valores de sus columnas permanecen juntos. Las filas devueltas conservan sus etiquetas de índice originales, a menos que restablezcas el índice. También se conserva un índice personalizado, igual que uno entero predeterminado.

Barajar todas las filas de DataFrame con pandas.DataFrame.sample()

pandas.DataFrame.sample() es la opción más directa cuando el DataFrame ya está en pandas. Este ejemplo crea una tabla pequeña e imprime una copia con las filas barajadas. Fija random_state para mostrar un orden concreto; omite ese argumento si quieres que cada llamada elija un orden nuevo.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import pandas as pd

df = pd.DataFrame({
    "item": ["pear", "plum", "lime", "fig"],
    "quantity": [4, 2, 5, 1],
})
shuffled = df.sample(frac=1, random_state=1)
print(shuffled)

Salida de este ejemplo:

   item  quantity
3   fig         1
2  lime         5
0  pear         4
1  plum         2

La asignación mantiene disponible el df original en su orden actual. Usa axis=0 explícitamente si quieres dejar clara la selección de filas; si lo omites, el comportamiento por filas es el mismo.

Restablecer el índice después de barajar

El resultado barajado conserva las etiquetas de las filas de origen, por lo que el índice puede quedar fuera de secuencia. Para sustituir esas etiquetas por 0, 1, 2, ..., encadena reset_index(drop=True) después del muestreo:

shuffled = df.sample(frac=1).reset_index(drop=True)

reset_index() normalmente conserva el índice anterior como una columna. Al establecer drop=True, se descartan esas etiquetas anteriores. Elige esta opción cuando el código posterior necesite un índice secuencial nuevo; omítela si las etiquetas originales identifican los registros y deben seguir asociadas a ellos.

Barajar filas con numpy.random.permutation()

NumPy ofrece otra forma de seleccionar filas en orden aleatorio. numpy.random.permutation() permuta una secuencia de posiciones de fila; pasa esas posiciones a df.iloc[...] para seleccionar las filas completas correspondientes. Por ejemplo, la expresión principal es df.iloc[numpy.random.permutation(len(df))]. Esta forma posicional funciona independientemente de las etiquetas de índice del DataFrame. La operación devuelve las filas en el orden generado, que puede variar entre llamadas. Restablece el índice del resultado solo si te sirven etiquetas secuenciales nuevas.

Barajar filas con sklearn.utils.shuffle()

Si scikit-learn ya forma parte de tu proyecto, sklearn.utils.shuffle(df) devuelve las filas en orden barajado y conserva la asociación entre las columnas de cada fila. Es una alternativa al muestreo de pandas y requiere el paquete scikit-learn; instálalo en el entorno donde se ejecuta tu programa si aún no está disponible. En un flujo de trabajo que solo usa pandas, df.sample(frac=1) evita añadir esa dependencia. En ambos casos, conserva el DataFrame devuelto (o asígnalo de nuevo a df) para usar el nuevo orden. Estos métodos barajan filas completas; no mezclan los valores dentro de una fila ni seleccionan solo una parte de la tabla.