2015-04-11 20 views
110

Ho il seguente dataframe:Shuffle dataframe righe

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 
... 

Il dataframe viene letto da un file CSV. Tutte le righe che hanno Type 1 sono in cima, seguiti dai filari con Type 2, seguiti dai filari con Type 3, ecc

vorrei mischiare righe del dataframe, in modo che tutti i Type 's sono mescolati. Un possibile risultato potrebbe essere:

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 
... 

Come si può vedere dal risultato, l'ordine delle righe viene mescolato, ma le colonne rimangono gli stessi. Non so se lo sto spiegando chiaramente. Fammi sapere se non lo faccio.

Come posso ottenere questo risultato?

risposta

230

il modo più idiomatico per fare questo con i panda è quello di utilizzare il metodo del vostro dataframe .sample, cioè

df.sample(frac=1) 

l'argomento frac parola chiave specifica la frazione di righe per tornare nel campione casuale, quindi frac=1 significa restituire tutte le righe (in ordine casuale).

Nota: Se si desidera rimescola il tuo dataframe sul posto e reimpostare l'indice, si potrebbe fare per esempio

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

Qui, specificando drop=True impedisce .reset_index da creare una colonna contenente le vecchie voci di indice.

+1

Re. il tuo ** note **, il metodo 'sample()' non ha il parametro 'inplace', quindi sembra che non sia (attualmente) possibile fare ciò che hai suggerito senza creare un nuovo oggetto. –

+0

@ m-dz Hai davvero letto ciò che ho suggerito? – Kris

+0

Citazione dall'alto "Nota: se si desidera mescolare il dataframe sul posto [...]". –

35

È possibile mischiare le righe di un dataframe indicizzando con un indice shuffled. Per questo, è possibile ad esempio utilizzare np.random.permutation (ma np.random.choice è anche una possibilità):

In [12]: df = pd.read_csv(StringIO(s), sep="\s+") 

In [13]: df 
Out[13]: 
    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 

In [14]: df.iloc[np.random.permutation(len(df))] 
Out[14]: 
    Col1 Col2 Col3 Type 
46 16 17 18  3 
45 13 14 15  3 
20  7  8  9  2 
0  1  2  3  1 
1  4  5  6  1 
21 10 11 12  2 

Se si desidera mantenere l'indice numerati da 1, 2, .., n come nel tuo esempio, si può semplicemente ripristinare l'indice: df_shuffled.reset_index(drop=True)

62

Si può semplicemente utilizzare sklearn per questo

from sklearn.utils import shuffle 
df = shuffle(df)