Tengo el siguiente DataFrame:
Col1 Col2 Col3 Type
0 1 2 3 1
1 4 5 6 1
...
20 7 8 9 2
21 10 11 12 2
...
45 13 14 15 3
46 16 17 18 3
...
El DataFrame se lee desde un archivo csv. Todas las filas que tienen Type
1 están arriba, seguidas por las filas con Type
2, seguidas por las filas con Type
3, etc.
Me gustaría barajar el orden de las filas del DataFrame, para que todos Type
se mezclen. Un posible resultado podría ser:
Col1 Col2 Col3 Type
0 7 8 9 2
1 13 14 15 3
...
20 1 2 3 1
21 10 11 12 2
...
45 4 5 6 1
46 16 17 18 3
...
¿Cómo puedo conseguir esto?
.copy()
sigues haciendo referencia al mismo objeto subyacente.Simplemente puede usar sklearn para esto
fuente
Puede barajar las filas de un marco de datos indexando con un índice barajado. Para esto, por ejemplo, puede usar
np.random.permutation
(peronp.random.choice
también es una posibilidad):Si desea mantener el índice numerado de 1, 2, .., n como en su ejemplo, simplemente puede restablecer el índice:
df_shuffled.reset_index(drop=True)
fuente
TL; DR :
np.random.shuffle(ndarray)
puede hacer el trabajo.Entonces, en tu caso
DataFrame
, bajo el capó, utiliza NumPy ndarray como titular de datos. (Puede verificar desde el código fuente de DataFrame )Entonces, si lo usa
np.random.shuffle()
, barajaría la matriz a lo largo del primer eje de una matriz multidimensional. Pero el índice de losDataFrame
restos sin mezclar.Sin embargo, hay algunos puntos a considerar.
sklearn.utils.shuffle()
, como sugirió el usuario tj89, puede designarrandom_state
junto con otra opción para controlar la salida. Es posible que desee eso para fines de desarrollo.sklearn.utils.shuffle()
es más rápido. Pero SHUFFLE la información del eje (índice, columna) delDataFrame
junto con elndarray
que contiene.Resultado de referencia
entre
sklearn.utils.shuffle()
ynp.random.shuffle()
.ndarray
0.10793248389381915 seg. 8 veces más rápido
0.8897626010002568 seg
Marco de datos
0.3183923360193148 seg. 3 veces más rápido
0.9357550159329548 sec
código usado
pitónevaluación comparativa
fuente
df = df.sample(frac=1)
hace exactamente lo mismo quedf = sklearn.utils.shuffle(df)
? Según mis medicionesdf = df.sample(frac=1)
es más rápido y parece realizar exactamente la misma acción. Ambos también asignan nueva memoria.np.random.shuffle(df.values)
es el más lento, pero no asigna nueva memoria.df.sample(frac=1)
es aproximadamente un 20% más rápido quesklearn.utils.shuffle(df)
, usando el mismo código anterior. O podrías hacersklearn.utils.shuffle(ndarray)
para obtener un resultado diferente.(No tengo suficiente reputación para comentar esto en la publicación principal, así que espero que alguien más pueda hacer eso por mí). Hubo una preocupación que surgió del primer método:
hizo una copia profunda o simplemente cambió el marco de datos. Ejecuté el siguiente código:
y mis resultados fueron:
lo que significa que el método no devuelve el mismo objeto, como se sugirió en el último comentario. Entonces, este método realmente hace una copia barajada .
fuente
id
), el objeto subyacente no se copia. En otras palabras, la operación está efectivamente en memoria (aunque es cierto que no es obvio).Lo que también es útil, si lo usa para Machine_learning y desea separar siempre los mismos datos, puede usar:
esto asegura que mantengas tu opción aleatoria siempre replicable
fuente
AFAIK la solución más simple es:
fuente
np.random.permutation
: "... Si x es una matriz, haga una copia y baraje los elementos al azar". Documentación deDataFrame.reindex
: "Se produce un nuevo objeto a menos que el nuevo índice sea equivalente al actual y copy = False". Entonces la respuesta es perfectamente segura (aunque produzca una copia).np.random.permutation says
, y dependiendo de las versiones de numpy, obtienes el efecto que describí o el que mencionas. Con numpy> 1.15.0, creando un marco de datos y haciendo un planonp.random.permutation(df.index)
, los índices en el df original cambian. Lo mismo no es cierto para numpy == 1.14.6. Entonces, más que nunca, repito mi advertencia: esa forma de hacer las cosas es peligrosa debido a efectos secundarios imprevistos y dependencias de la versión.Index
tipo ... En cualquier caso, baso mis recomendaciones / advertencias en el comportamiento real, no en los documentos: pbaraja el marco de datos de pandas tomando una matriz de muestra en este caso índice y aleatoriza su orden y luego configura la matriz como un índice de marco de datos. Ahora ordene el marco de datos según el índice. Aquí va tu marco de datos barajado
salida
Inserte su marco de datos en el lugar mío en el código anterior.
fuente
Aquí hay otra forma:
df['rnd'] = np.random.rand(len(df)) df = df.sort_values(by='rnd', inplace=True).drop('rnd', axis=1)
fuente