Ich habe den folgenden DataFrame, in dem eine der Spalten ein Objekt ist (Zelltypzelle):
df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]})
df
Out[458]:
A B
0 1 [1, 2]
1 2 [1, 2]
Meine erwartete Ausgabe ist:
A B
0 1 1
1 1 2
3 2 1
4 2 2
Was soll ich tun, um dies zu erreichen?
Verwandte Frage
Pandas: Wenn Zelleninhalte Listen sind, erstellen Sie für jedes Element in der Liste eine Zeile
Gute Frage und Antwort, aber nur eine Spalte mit Liste behandeln (In meiner Antwort funktioniert die Selbstdefinitionsfunktion für mehrere Spalten, auch die akzeptierte Antwort ist die zeitaufwändigste apply
, was nicht empfohlen wird. Überprüfen Sie weitere Informationen. Wann sollte ich jemals wollen Pandas verwenden () in meinem Code anwenden? )
Antworten:
Als Benutzer mit beiden
R
und habepython
ich diese Art von Frage ein paar Mal gesehen.In R haben sie die eingebaute Funktion aus dem
tidyr
aufgerufenen Paketunnest
. InPython
(pandas
) gibt es jedoch keine integrierte Funktion für diese Art von Frage.Ich weiß, dass
object
Spalten estype
immer schwierig machen, Daten mit einerpandas
Funktion zu konvertieren . Als ich die Daten so erhielt, fiel mir als erstes ein, die Spalten zu "glätten" oder zu entfernen.Ich benutze
pandas
undpython
Funktionen für diese Art von Frage. Wenn Sie sich Sorgen über die Geschwindigkeit der oben genannten Lösungen machen, überprüfen Sie die Antwort von user3483203, da er verwendetnumpy
und die meiste Zeitnumpy
schneller ist. Ich empfehleCpython
undnumba
wenn Geschwindigkeit in Ihrem Fall wichtig ist.Methode 0 [pandas> = 0.25]
Ab pandas 0.25 können Sie die folgende Funktion verwenden , wenn Sie nur eine Spalte auflösen
explode
müssen:Methode 1
apply + pd.Series
(leicht zu verstehen, aber in Bezug auf die Leistung nicht empfohlen.)Methode 2
Verwenden
repeat
mitDataFrame
Konstruktor, erstellen Sie Ihren Datenrahmen (gut an Leistung, nicht gut an mehreren Spalten)Methode 2.1
zum Beispiel neben A haben wir A.1 ..... An Wenn wir die obige Methode ( Methode 2 ) noch verwenden , ist es für uns schwierig, die Spalten einzeln neu zu erstellen.
Lösung:
join
odermerge
mit demindex
Nach 'unnest' die einzelnen SpaltenWenn Sie die Spaltenreihenfolge genau wie zuvor benötigen, fügen Sie sie
reindex
am Ende hinzu.Methode 3
erstellt das neu
list
Wenn mehr als zwei Spalten vorhanden sind, verwenden Sie
Methode 4
mit
reindex
oderloc
Methode 5,
wenn die Liste nur eindeutige Werte enthält:
Methode 6
mit
numpy
hoher Leistung:Methode 7
mit Basisfunktion
itertools
cycle
undchain
: Reine Python-Lösung nur zum SpaßVerallgemeinern auf mehrere Spalten
Self-Def-Funktion:
Spaltenweise Unnesting
Alles oben genanntes Verfahren spricht über das vertikale Auseinanderschieben und explodiert, wenn Sie tun müssen , um die Liste aufwenden horizontal , Check mit
pd.DataFrame
KonstruktorAktualisierte Funktion
Testausgabe
quelle
ValueError: zero-dimensional arrays cannot be concatenated
. Außerdem versuchen nur wenige von ihnen, auf einen breiteren Datenrahmen zu verallgemeinern. Diejenigen, die behaupten, dass Sie immer noch wissen müssen, wie viele Spalten Ihr df im Voraus hat.[]
sollte es fallen gelassen werden, hast du das Beispiel wirklich von mir ausprobiert? Oder hast du eine andere Situation?Option 1
Wenn alle Unterlisten in der anderen Spalte dieselbe Länge haben,
numpy
kann dies hier eine effiziente Option sein:Option 2
Wenn die Unterlisten unterschiedlich lang sind, benötigen Sie einen zusätzlichen Schritt:
Option 3
Ich habe versucht, dies zu verallgemeinern, um
N
Spalten und Kachelsäulen zu glätten.M
Ich werde später daran arbeiten, es effizienter zu machen:Funktionen
Timings
Performance
quelle
df.explode
Methode zu kennen.Das Auflösen einer listenartigen Spalte wurde in Pandas 0.25 durch Hinzufügen der folgenden
explode()
Methode erheblich vereinfacht :Aus:
quelle
Eine Alternative besteht darin, das Meshgrid-Rezept über die Zeilen der Spalten auf unnest anzuwenden:
Ausgabe
quelle
Meine 5 Cent:
und weitere 5
beides führt zum gleichen Ergebnis
quelle
Da normalerweise die Länge der Unterliste unterschiedlich ist und das Verbinden / Zusammenführen weitaus rechenintensiver ist. Ich habe die Methode für Unterlisten unterschiedlicher Länge und normalere Spalten erneut getestet.
MultiIndex sollte auch einfacher zu schreiben sein und hat fast die gleiche Leistung wie numpy.
Überraschenderweise hat in meinem Implementierungsverständnis der Weg die beste Leistung.
Performance
Relative Zeit jeder Methode
quelle
Ich habe das Problem ein wenig verallgemeinert, um es auf mehr Spalten anzuwenden.
Zusammenfassung meiner Lösung:
Vollständiges Beispiel:
Die eigentliche Explosion erfolgt in 3 Zeilen. Der Rest ist Kosmetik (mehrspaltige Explosion, Behandlung von Zeichenfolgen anstelle von Listen in der Explosionsspalte, ...).
Dank an die Antwort von WeNYoBen
quelle
Problemeinrichtung
Angenommen, es befinden sich mehrere Spalten mit Objekten unterschiedlicher Länge
Wenn die Längen gleich sind, können wir leicht annehmen, dass die verschiedenen Elemente zusammenfallen und zusammen "gezippt" werden sollten.
Die Annahme wird jedoch in Frage gestellt, wenn wir Objekte unterschiedlicher Länge sehen. Sollten wir "zippen", wenn ja, wie gehen wir mit dem Überschuss in einem der Objekte um? ODER , vielleicht wollen wir das Produkt aller Objekte. Dies wird schnell groß, könnte aber das sein, was gewünscht wird.
ODER
Die Funktion
Diese Funktion behandelt
zip
oderproduct
basiert auf einem Parameter und basiert aufzip
der Länge des längsten Objekts mitzip_longest
Reißverschluss
Produkt
Neues Setup
Das Beispiel etwas variieren
Reißverschluss
Produkt
quelle
Etwas ziemlich Unempfehlenswertes (zumindest in diesem Fall funktionieren):
concat
+sort_index
+iter
+apply
+next
.Jetzt:
Ist:
Wenn Sie sich für den Index interessieren:
Jetzt:
Ist:
quelle
Irgendwelche Meinungen zu dieser Methode, an die ich gedacht habe? oder wird sowohl Concat als auch Melt als zu "teuer" angesehen?
quelle
quelle
quelle
In meinem Fall mit mehr als einer zu explodierenden Spalte und mit Variablenlängen für die Arrays, die nicht verschachtelt werden müssen.
Am Ende habe ich die neue Pandas 0.25-
explode
Funktion zweimal angewendet, dann generierte Duplikate entfernt und es macht den Job!quelle