Ich arbeite mit einer großen CSV-Datei und die vorletzte Spalte enthält eine Textzeichenfolge, die ich durch ein bestimmtes Trennzeichen teilen möchte. Ich habe mich gefragt, ob es einen einfachen Weg gibt, dies mit Pandas oder Python zu tun.
CustNum CustomerName ItemQty Item Seatblocks ItemExt
32363 McCartney, Paul 3 F04 2:218:10:4,6 60
31316 Lennon, John 25 F01 1:13:36:1,12 1:13:37:1,13 300
Ich möchte durch das Leerzeichen (' ')
und dann den Doppelpunkt (':')
in der Seatblocks
Spalte teilen , aber jede Zelle würde zu einer anderen Anzahl von Spalten führen. Ich habe eine Funktion zum Neuanordnen der Spalten, sodass sich die Seatblocks
Spalte am Ende des Blattes befindet, bin mir aber nicht sicher, was ich von dort aus tun soll. Ich kann dies in Excel mit der integrierten text-to-columns
Funktion und einem schnellen Makro tun , aber mein Datensatz enthält zu viele Datensätze, als dass Excel sie verarbeiten könnte.
Letztendlich möchte ich Aufzeichnungen wie die von John Lennon aufnehmen und mehrere Zeilen erstellen, wobei die Informationen von jedem Sitzsatz in einer separaten Zeile stehen.
Antworten:
Dies teilt die Sitzblöcke nach Raum und gibt jedem seine eigene Reihe.
Oder um jedem durch Doppelpunkte getrennten String eine eigene Spalte zu geben:
Das ist ein bisschen hässlich, aber vielleicht mischt sich jemand mit einer schöneren Lösung ein.
quelle
DataFrame
sehr schnell in die Luft sprengt . In meinem Fall führte das Ausführen des Codes in einer ~ 200M-Tabelle zu einer ~ 10G-Speichernutzung (+ Swap ...).split()
, weil esreduce()
wie ein Zauber wirkt , einfach durch die Säule zu gehen. Das Problem kann dann instack()
...NameError: name 'Series' is not defined
dafür. woherSeries
soll das kommen EDIT: egal, es sollte sein,pandas.Series
da es sich auf den Artikel vonpandas
from pandas import Series
für Bequemlichkeit / Kürze.Anders als Dan finde ich seine Antwort ziemlich elegant ... aber leider ist sie auch sehr, sehr ineffizient. Da in der Frage "eine große CSV-Datei" erwähnt wurde , möchte ich vorschlagen, eine Shell-Lösung von Dan auszuprobieren:
... im Vergleich zu dieser Alternative:
... und das:
Die zweite verzichtet einfach auf die Zuweisung von 100 000 Serien, und dies reicht aus, um sie etwa zehnmal schneller zu machen. Die dritte Lösung, die ironischerweise viele Aufrufe von str.split () verschwendet (sie wird einmal pro Spalte und Zeile aufgerufen, also dreimal mehr als bei den beiden anderen Lösungen), ist etwa 40-mal schneller als die erste. weil es sogar vermeidet, die 100 000 Listen zu instanziieren. Und ja, es ist sicherlich ein bisschen hässlich ...
BEARBEITEN: Diese Antwort schlägt vor, wie man "to_list ()" verwendet und die Notwendigkeit eines Lambda vermeidet. Das Ergebnis ist so etwas wie
Das ist noch effizienter als die dritte Lösung und sicherlich viel eleganter.
EDIT: das noch einfacher
funktioniert auch und ist fast genauso effizient.
EDIT: noch einfacher ! Und behandelt NaNs (aber weniger effizient):
quelle
tolist()
ist perfekt. In meinem Fall wollte ich nur eines der Daten in der Liste und konnte mit .ix:df['newCol'] = pd.DataFrame(df.col.str.split().tolist()).ix[:,2]
obect of type 'float' has no len()
das verwirrend war, bis ich merkte, dass einige meiner ReihenNaN
im Gegensatz zu ihnen warenstr
.Eine andere ähnliche Lösung mit Verkettung ist Verwendung
reset_index
undrename
:Wenn in der Spalte KEINE
NaN
Werte enthalten sind, ist die schnellste Lösung das Verwendungsverständnislist
mit demDataFrame
Konstruktor:Aber wenn Spalte enthält
NaN
, funktioniert nurstr.split
mit Parametern,expand=True
die zurückgebenDataFrame
( Dokumentation ), und es erklärt, warum es langsamer ist:quelle
expand=True
Option benötigen, mit der Sie arbeiten,pandas.DataFrames
während Sie sie verwenden.str.split()
.Ein anderer Ansatz wäre wie folgt:
quelle
Kann auch groupby () verwenden, ohne dass Join und Stack () erforderlich sind.
Verwenden Sie die obigen Beispieldaten:
quelle
0 31316 Lennon, John 25 F01 300 1:13:36:1,12 A
und nächste Zeile0 31316 Lennon, John 25 F01 300 1:13:37:1,13 B
Dies scheint eine weitaus einfachere Methode zu sein als die an anderer Stelle in diesem Thread vorgeschlagenen.
geteilte Zeilen im Pandas-Datenrahmen
quelle