Ich habe den folgenden 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
...
Der DataFrame wird aus einer CSV-Datei gelesen. Alle Zeilen mit Type
1 befinden sich oben, gefolgt von den Zeilen mit Type
2, gefolgt von den Zeilen mit Type
3 usw.
Ich möchte die Reihenfolge der DataFrame-Zeilen mischen, damit alle Type
gemischt werden. Ein mögliches Ergebnis könnte sein:
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
...
Wie kann ich das erreichen?
.copy()
, verweisen Sie immer noch auf dasselbe zugrunde liegende Objekt.Sie können dazu einfach sklearn verwenden
quelle
Sie können die Zeilen eines Datenrahmens mischen, indem Sie mit einem gemischten Index indizieren. Hierfür können Sie zB verwenden
np.random.permutation
(ist abernp.random.choice
auch eine Möglichkeit):Wenn Sie den Index wie in Ihrem Beispiel von 1, 2, .., n nummerieren möchten, können Sie den Index einfach zurücksetzen:
df_shuffled.reset_index(drop=True)
quelle
TL; DR :
np.random.shuffle(ndarray)
kann den Job machen.Also in deinem Fall
DataFrame
verwendet unter der Haube NumPy ndarray als Datenhalter. (Sie können dies anhand des DataFrame-Quellcodes überprüfen. )Wenn Sie also verwenden
np.random.shuffle()
, wird das Array entlang der ersten Achse eines mehrdimensionalen Arrays gemischt. Aber der Index derDataFrame
bleibt ungemischt.Es gibt jedoch einige Punkte zu beachten.
sklearn.utils.shuffle()
kann, wie der Benutzer tj89 vorgeschlagen hat,random_state
zusammen mit einer anderen Option zur Steuerung der Ausgabe festlegen . Vielleicht möchten Sie das für Entwicklerzwecke.sklearn.utils.shuffle()
ist schneller. Aber wird die Achseninfo (Index, Spalte) derDataFrame
zusammen mit derndarray
darin enthaltenen mischen .Benchmark-Ergebnis
zwischen
sklearn.utils.shuffle()
undnp.random.shuffle()
.ndarray
0,10793248389381915 Sek. 8x schneller
0,8897626010002568 Sek
DataFrame
0,3183923360193148 Sek. 3x schneller
0,9357550159329548 Sek
gebrauchter Code
PythonBenchmarking
quelle
df = df.sample(frac=1)
genau das Gleiche wiedf = sklearn.utils.shuffle(df)
? Nach meinen Messungendf = df.sample(frac=1)
ist schneller und scheint genau die gleiche Aktion auszuführen. Sie weisen auch beide neuen Speicher zu.np.random.shuffle(df.values)
ist am langsamsten, weist aber keinen neuen Speicher zu.df.sample(frac=1)
ungefähr 20% schneller zu sein alssklearn.utils.shuffle(df)
mit demselben Code wie oben. Oder Sie könnten tunsklearn.utils.shuffle(ndarray)
, um ein anderes Ergebnis zu erzielen.(Ich habe nicht genug Ruf, um dies im Top-Beitrag zu kommentieren, also hoffe ich, dass jemand anderes das für mich tun kann.) Es gab Bedenken, dass die erste Methode:
machte eine tiefe Kopie oder änderte nur den Datenrahmen. Ich habe den folgenden Code ausgeführt:
und meine Ergebnisse waren:
Dies bedeutet, dass die Methode nicht dasselbe Objekt zurückgibt, wie im letzten Kommentar vorgeschlagen. Diese Methode erstellt also tatsächlich eine gemischte Kopie .
quelle
id
das zugrunde liegende Objekt nicht kopiert wird , obwohl sich die Referenzen geändert haben (verschiedene s) . Mit anderen Worten, die Operation befindet sich effektiv im Speicher (obwohl dies zugegebenermaßen nicht offensichtlich ist).Was auch nützlich ist, wenn Sie es für Machine_learning verwenden und immer dieselben Daten trennen möchten, können Sie Folgendes verwenden:
Dies stellt sicher, dass Sie Ihre zufällige Auswahl immer replizierbar halten
quelle
AFAIK die einfachste Lösung ist:
quelle
np.random.permutation
: "... Wenn x ein Array ist, erstellen Sie eine Kopie und mischen Sie die Elemente nach dem Zufallsprinzip." Dokumentation vonDataFrame.reindex
: "Ein neues Objekt wird erstellt, es sei denn, der neue Index entspricht dem aktuellen und copy = False". Die Antwort ist also absolut sicher (obwohl eine Kopie erstellt wird).np.random.permutation says
und abhängig von den Versionen von numpy erhalten Sie den von mir beschriebenen oder den von Ihnen erwähnten Effekt. Mit numpy> 1.15.0, wenn ein Datenrahmen erstellt und eine Ebene erstellt wirdnp.random.permutation(df.index)
, ändern sich die Indizes in der ursprünglichen df. Gleiches gilt nicht für numpy == 1.14.6. Deshalb wiederhole ich mehr denn je meine Warnung: Diese Vorgehensweise ist aufgrund unvorhergesehener Nebenwirkungen und Versionsabhängigkeiten gefährlich.Index
Typs ... Auf jeden FallMische die Datenrahmen pandas durch Entnahme einer Probe Array in diesem Fall unter Index und randomisieren seiner um den Array als Index der Datenrahmen dann eingestellt. Sortieren Sie nun den Datenrahmen nach Index. Hier geht Ihr gemischter Datenrahmen
Ausgabe
Fügen Sie Ihren Datenrahmen an meiner Stelle im obigen Code ein.
quelle
Hier ist ein anderer Weg:
df['rnd'] = np.random.rand(len(df)) df = df.sort_values(by='rnd', inplace=True).drop('rnd', axis=1)
quelle