Ich möchte eine Pandas-Zelle mit einer Liste in Zeilen für jeden dieser Werte umwandeln.
Also, nimm das:
Wenn ich die Werte in der nearest_neighbors
Spalte entpacken und stapeln möchte, sodass jeder Wert eine Zeile in jedem opponent
Index ist, wie würde ich am besten vorgehen? Gibt es Pandas-Methoden, die für solche Operationen gedacht sind?
pd.DataFrame(df.nearest_neighbors.values.tolist())
diese Spalte entpacken und dannpd.merge
mit den anderen zusammenkleben.values.tolist()
, hier macht nichts; Die Spalte ist bereits eine ListeAntworten:
Im folgenden Code habe ich zuerst den Index zurückgesetzt, um die Zeileniteration zu vereinfachen.
Ich erstelle eine Liste von Listen, in der jedes Element der äußeren Liste eine Zeile des Zieldatenrahmens und jedes Element der inneren Liste eine der Spalten ist. Diese verschachtelte Liste wird letztendlich verkettet, um den gewünschten DataFrame zu erstellen.
Ich benutze eine
lambda
Funktion zusammen mit einer Listeniteration, um eine Zeile für jedes Element desnearest_neighbors
gepaarten mit dem relevantenname
und zu erstellenopponent
.Schließlich erstelle ich aus dieser Liste einen neuen DataFrame (unter Verwendung der ursprünglichen Spaltennamen und Zurücksetzen des Index auf
name
undopponent
).EDIT JUNI 2017
Eine alternative Methode ist wie folgt:
quelle
apply(pd.Series)
ist auf kleinsten Frames in Ordnung, aber für Frames mit angemessener Größe sollten Sie eine leistungsfähigere Lösung überdenken. Siehe Wann sollte ich jemals pandas apply () in meinem Code verwenden? (Eine bessere Lösung besteht darin, zuerst die Spalte aufzulisten.)explode()
Methode erheblich vereinfacht . Ich habe eine Antwort mit einem Beispiel hinzugefügt , das dasselbe df-Setup wie hier verwendet.Verwenden Sie
apply(pd.Series)
undstack
, dannreset_index
undto_frame
Einzelheiten
quelle
df.nearest_neighbors.apply(pd.Series)
ist für mich sehr erstaunlich;explode()
Methode erheblich vereinfacht :Aus:
quelle
Ich denke, dies ist eine wirklich gute Frage. In Hive würden Sie sie verwenden
EXPLODE
. Ich denke, es ist zu begründen, dass Pandas diese Funktionalität standardmäßig enthalten sollten. Ich würde wahrscheinlich die Listenspalte mit einem verschachtelten Generatorverständnis wie folgt auflösen:quelle
Die schnellste Methode, die ich bisher gefunden habe, ist das Erweitern des DataFrame mit
.iloc
und das Zurückweisen der abgeflachten Zielspalte .Bei der üblichen Eingabe (etwas repliziert):
Angesichts der folgenden vorgeschlagenen Alternativen:
Ich finde das
extend_iloc()
ist das schnellste :quelle
cols = [c for c in df.columns if c != col_target]
sein sollte:cols = [i for i,c in enumerate(df.columns) if c != col_target]
Diedf.iloc[ilocations, cols].copy()
Fehler, wenn sie nicht mit dem Spaltenindex dargestellt werden.Schönere alternative Lösung mit apply (pd.Series):
quelle
Ähnlich wie bei der EXPLODE-Funktionalität von Hive:
quelle
NameError: global name 'copy' is not defined
Alle diese Antworten sind gut, aber ich wollte etwas wirklich Einfaches. Hier ist mein Beitrag:
Das war's ... benutze dies einfach, wenn du eine neue Serie willst, in der die Listen "explodiert" sind. Hier ist ein Beispiel, in dem wir value_counts () für Taco-Entscheidungen ausführen :)
quelle
Hier ist eine mögliche Optimierung für größere Datenrahmen. Dies läuft schneller, wenn im Feld "Explodieren" mehrere gleiche Werte vorhanden sind. (Je größer der Datenrahmen im Vergleich zur Anzahl der eindeutigen Werte im Feld ist, desto besser ist die Leistung dieses Codes.)
quelle
Erweiterung der
.iloc
Antwort von Oleg, um automatisch alle Listenspalten zu reduzieren:Dies setzt voraus, dass jede Listenspalte die gleiche Listenlänge hat.
quelle
Anstatt apply (pd.Series) zu verwenden, können Sie die Spalte reduzieren. Dies verbessert die Leistung.
quelle