HOWTO · Pandas
Zufälliges Mischen von DataFrame-Zeilen in Pandas
Mischen Sie alle Zeilen eines pandas-DataFrame mit pandas.DataFrame.sample(), numpy.random.permutation() oder sklearn.utils.shuffle().
Auf dieser Seite
Um alle Zeilen eines pandas-DataFrame neu anzuordnen, rufen Sie sample(frac=1) auf. Das Argument frac fordert eine Stichprobe mit sämtlichen Zeilen an, und axis=0 wählt Zeilen aus (dies ist die Voreinstellung). Beim Sampling wird ein neues DataFrame zurückgegeben; das ursprüngliche Objekt wird nicht umgeordnet. Die Reihenfolge ist zufällig, daher können separate Aufrufe unterschiedliche Anordnungen ergeben. Beim Standardverhalten erscheint jede Ausgangszeile genau einmal, und ihre Spaltenwerte bleiben zusammen. Die zurückgegebenen Zeilen behalten ihre ursprünglichen Indexlabels, sofern Sie den Index nicht zurücksetzen. Ein benutzerdefinierter Index bleibt ebenso erhalten wie ein standardmäßiger ganzzahliger Index.
Alle DataFrame-Zeilen mit pandas.DataFrame.sample() mischen
pandas.DataFrame.sample() ist die direkteste Option, wenn das DataFrame bereits in pandas vorliegt. Dieses Beispiel erstellt eine kleine Tabelle und gibt eine gemischte Kopie aus. Mit random_state wird eine konkrete Reihenfolge festgelegt; lassen Sie dieses Argument weg, wenn jeder Aufruf eine neue Reihenfolge wählen soll.
Führen Sie dieses Beispiel aus. Die Bezeichnungen in Code und Ausgabe bleiben auf Englisch.
import pandas as pd
df = pd.DataFrame({
"item": ["pear", "plum", "lime", "fig"],
"quantity": [4, 2, 5, 1],
})
shuffled = df.sample(frac=1, random_state=1)
print(shuffled)
Ausgabe dieses Beispiels:
item quantity
3 fig 1
2 lime 5
0 pear 4
1 plum 2
Durch die Zuweisung bleibt das ursprüngliche df in seiner bisherigen Reihenfolge verfügbar. Geben Sie axis=0 ausdrücklich an, wenn Sie die Auswahl der Zeilen für Leser verdeutlichen möchten; ohne diese Angabe gilt dasselbe zeilenweise Verhalten.
Den Index nach dem Mischen zurücksetzen
Ein gemischtes Ergebnis behält die Labels der Ausgangszeilen, daher kann sein Index eine nicht fortlaufende Reihenfolge aufweisen. Um diese Labels durch 0, 1, 2, ... zu ersetzen, verketten Sie nach dem Sampling reset_index(drop=True):
shuffled = df.sample(frac=1).reset_index(drop=True)
reset_index() übernimmt normalerweise den alten Index als Spalte. Mit drop=True werden diese alten Labels stattdessen verworfen. Verwenden Sie diese Option, wenn nachfolgender Code einen neuen fortlaufenden Index erwartet. Lassen Sie sie weg, wenn die ursprünglichen Labels Datensätze kennzeichnen und ihnen zugeordnet bleiben sollen.
Zeilen mit numpy.random.permutation() mischen
NumPy bietet eine weitere Möglichkeit, Zeilen in zufälliger Reihenfolge auszuwählen. numpy.random.permutation() permutiert eine Folge von Zeilenpositionen. Übergeben Sie diese Positionen an df.iloc[...], um die entsprechenden vollständigen Zeilen auszuwählen. Der zentrale Ausdruck lautet zum Beispiel df.iloc[numpy.random.permutation(len(df))]. Diese positionsbasierte Form funktioniert unabhängig von den Indexlabels des DataFrame. Der Vorgang gibt die Zeilen in der erzeugten Reihenfolge zurück, die sich zwischen Aufrufen unterscheiden kann. Setzen Sie den Index des Ergebnisses nur zurück, wenn neue fortlaufende Labels nützlich sind.
Zeilen mit sklearn.utils.shuffle() mischen
Wenn scikit-learn bereits Teil Ihres Projekts ist, gibt sklearn.utils.shuffle(df) die Zeilen in gemischter Reihenfolge zurück und erhält dabei die Zuordnung der Spaltenwerte innerhalb jeder Zeile. Das ist eine Alternative zum Sampling mit pandas und erfordert das Paket scikit-learn. Installieren Sie es in der Umgebung, in der Ihr Programm ausgeführt wird, falls es dort nicht verfügbar ist. Für einen reinen pandas-Arbeitsablauf kommt df.sample(frac=1) ohne diese zusätzliche Abhängigkeit aus. Behalten Sie in beiden Fällen das zurückgegebene DataFrame bei (oder weisen Sie es erneut df zu), um die neue Reihenfolge zu verwenden. Diese Ansätze mischen vollständige Zeilen; sie mischen weder Werte innerhalb einer Zeile noch wählen sie nur einen Teil der Tabelle aus.