Cómo mezclar según la columna (id) pero mantener True ascendente.
Tengo un dataframe estructurado de la siguiente manera:
>>>df
a b id<br>
0 1 4 3<br>
1 4 1 2<br>
2 7 5 1
<p>3 2 9 3
4 4 11 2
5 2 7 1</p>
<p>6 3 4 2
7 9 2 1
He agregado párrafos para facilitar la lectura del código.
Ahora quiero mezclar el dataframe según el id, pero mantener el orden descendente inicial de la columna id. ¿Cuál es la mejor manera?
Una posible salida se vería así:
>>>df
a b id<br>
0 3 4 2
1 9 2 1
2 2 9 3
3 4 11 2
4 2 7 1
5 1 4 3<br>
6 4 1 2<br>
7 7 5 1
En principio, solo quiero que los bloques se mezclen o se coloquen aleatoriamente en otro lugar.
davy.ai
Para mezclar el dataframe según la columna ‘id’ manteniendo el orden descendente inicial de la columna ‘id’, podemos primero ordenar el dataframe basándonos en la columna ‘id’ en orden descendente utilizando la función
sort_values()
. Luego podemos usar la funcióngroupby()
para agrupar el dataframe por la columna ‘id’ y aplicar la funciónsample()
a cada grupo para mezclar las filas dentro de cada grupo. Finalmente, podemos restablecer el índice del dataframe mezclado utilizando la funciónreset_index()
.El código para mezclar el dataframe según la columna ‘id’ manteniendo el orden descendente inicial de la columna ‘id’ es el siguiente:
Este código primero ordena el dataframe original
df
basándose en la columna ‘id’ en orden descendente usandosort_values('id', ascending=False)
. Luego agrupa el dataframe ordenado por la columna ‘id’ usandogroupby('id')
. Para cada grupo, aplica la funciónsample(frac=1)
para mezclar las filas dentro del grupo. El argumentofrac=1
especifica que queremos muestrear todo el grupo, lo que efectivamente lo mezcla. Finalmente, restablece el índice del dataframe mezclado utilizandoreset_index(drop=True)
para obtener un nuevo dataframe mezclado llamadoshuffled_df
.Este código debería producir la salida deseada mostrada en la pregunta, donde los bloques están mezclados aleatoriamente dentro del dataframe pero aún mantienen su orden descendente original basado en la columna ‘id’.