Saya memiliki DataFrame berikut:
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
...
DataFrame dibaca dari file csv. Semua baris yang memiliki Type
1 berada di atas, diikuti oleh baris dengan Type
2, diikuti oleh baris dengan Type
3, dll.
Saya ingin mengocok urutan baris DataFrame, sehingga semuanya Type
tercampur. Hasil yang mungkin bisa berupa:
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
...
Bagaimana saya bisa mencapai ini?
.copy()
Anda masih merujuk objek dasar yang sama.Anda cukup menggunakan sklearn untuk ini
sumber
Anda bisa mengocok baris-baris suatu dataframe dengan mengindeks dengan indeks yang diacak. Untuk ini, Anda bisa mis menggunakan
np.random.permutation
(tetapinp.random.choice
juga kemungkinan):Jika Anda ingin menjaga agar indeks tetap bernomor 1, 2, .., n seperti pada contoh Anda, Anda dapat mengatur ulang indeks:
df_shuffled.reset_index(drop=True)
sumber
TL; DR :
np.random.shuffle(ndarray)
dapat melakukan pekerjaan itu.Jadi, dalam kasus Anda
DataFrame
, di bawah tenda, menggunakan NumPy ndarray sebagai pemegang data. (Anda dapat memeriksa dari kode sumber DataFrame )Jadi, jika Anda menggunakan
np.random.shuffle()
, itu akan mengocok array sepanjang sumbu pertama dari array multi-dimensi. Namun indeksDataFrame
tetap tidak tergoyahkan.Padahal, ada beberapa hal yang perlu dipertimbangkan.
sklearn.utils.shuffle()
, seperti yang disarankan pengguna, dapat menunjukrandom_state
bersama dengan opsi lain untuk mengontrol keluaran. Anda mungkin ingin itu untuk tujuan dev.sklearn.utils.shuffle()
lebih cepat. Tapi AKAN SHUFFLE info sumbu (indeks, kolom)DataFrame
besertandarray
isinya.Hasil benchmark
antara
sklearn.utils.shuffle()
dannp.random.shuffle()
.ndarray
0,10793248389381915 dtk. 8x lebih cepat
0,8897626010002568 detik
DataFrame
0,3183923360193148 dtk. 3x lebih cepat
0,9357550159329548 dtk
kode yang digunakan
ular sancabenchmarking
sumber
df = df.sample(frac=1)
melakukan hal yang sama persisdf = sklearn.utils.shuffle(df)
? Menurut pengukuran sayadf = df.sample(frac=1)
lebih cepat dan sepertinya melakukan tindakan yang sama persis. Mereka juga mengalokasikan memori baru.np.random.shuffle(df.values)
adalah yang paling lambat, tetapi tidak mengalokasikan memori baru.df.sample(frac=1)
sekitar 20% lebih cepat daripadasklearn.utils.shuffle(df)
, menggunakan kode yang sama di atas. Atau bisa Anda lakukansklearn.utils.shuffle(ndarray)
untuk mendapatkan hasil yang berbeda.(Saya tidak memiliki reputasi yang cukup untuk mengomentari ini pada posisi teratas, jadi saya berharap orang lain dapat melakukan itu untuk saya.) Ada kekhawatiran yang mengemukakan metode pertama:
membuat salinan yang dalam atau hanya mengubah kerangka data. Saya menjalankan kode berikut:
dan hasil saya adalah:
yang berarti metode ini tidak mengembalikan objek yang sama, seperti yang disarankan dalam komentar terakhir. Jadi metode ini memang membuat salinan acak .
sumber
id
), objek yang mendasarinya tidak disalin. Dengan kata lain, operasi ini secara efektif dalam memori (meskipun diakui itu tidak jelas).Apa yang juga berguna, jika Anda menggunakannya untuk Machine_learning dan ingin selalu memisahkan data yang sama, Anda bisa menggunakan:
ini memastikan, bahwa Anda menjaga pilihan acak Anda selalu dapat direplikasi
sumber
AFAIK solusi paling sederhana adalah:
sumber
np.random.permutation
: "... Jika x adalah array, buat salinan dan kocok elemen-elemen secara acak". DokumentasiDataFrame.reindex
: " Objek baru dihasilkan kecuali indeks baru setara dengan yang sekarang dan salin = Salah". Jadi jawabannya sangat aman (meskipun menghasilkan salinan).np.random.permutation says
, dan tergantung pada versi numpy, Anda mendapatkan efek yang saya jelaskan atau yang Anda sebutkan. Dengan numpy> 1.15.0, membuat bingkai data dan melakukan datarannp.random.permutation(df.index)
, indeks dalam perubahan df asli. Hal yang sama tidak berlaku untuk numpy == 1.14.6. Jadi, lebih dari sebelumnya, saya ulangi peringatan saya: cara melakukan sesuatu itu berbahaya karena efek samping yang tidak terduga dan ketergantungan versi.Index
tipe ... Dalam kasus apa pun, saya mendasarkan rekomendasi / peringatan saya pada perilaku aktual, bukan pada dokumen: pmengocok bingkai data panda dengan mengambil sampel array dalam indeks kasus ini dan mengacak urutannya kemudian mengatur array sebagai indeks bingkai data. Sekarang urutkan frame data berdasarkan indeks. Ini diaframe data acak Anda
keluaran
Masukkan bingkai data Anda di tempat saya dalam kode di atas.
sumber
Ini cara lain:
df['rnd'] = np.random.rand(len(df)) df = df.sort_values(by='rnd', inplace=True).drop('rnd', axis=1)
sumber