Ich habe einen Datenrahmen mit einer Spalte und möchte ihn in zwei Spalten aufteilen, wobei eine Spaltenüberschrift ' fips'
und die andere ' lautet'row'
Mein Datenrahmen df
sieht folgendermaßen aus:
row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
Ich weiß nicht, wie ich df.row.str[:]
mein Ziel, die Zeilenzelle zu teilen, erreichen soll. Ich kann verwenden df['fips'] = hello
, um eine neue Spalte hinzuzufügen und sie mit zu füllen hello
. Irgendwelche Ideen?
fips row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
read_table()
oderread_fwf()
Antworten:
Es könnte einen besseren Weg geben, aber dies ist ein Ansatz:
quelle
index = df.index
und du bist gut.split
Methode NaN zurück und dietolist
Methode gibt diesen Wert unverändert zurück (NaN), was dazu führtValueError
(um dieses Problem zu beheben, können Sie ihn vor dem Teilen in einen Zeichenfolgentyp umwandeln). Ich empfehle Ihnen, es selbst zu versuchen, es ist die beste Art zu lernen :-)df
dierow
Spaltenüberschrift hast ? Sie mögen denken, es ist eine Art DataFrame-Attribut, aber es ist ziemlich klar, dass dies der Name der Spalte ist. Es liegt an Ihnen, wie Sie Ihre Spaltenüberschriften erstellen und definieren. Wenn Sie also eine andere verwenden, verwenden Sie diese (zdf.my_column_name.split(...)
. B. ).TL; DR-Version:
Für den einfachen Fall von:
Die einfachste Lösung ist:
Oder Sie können einen DataFrame mit einer Spalte für jeden Eintrag des Split automatisch erstellen mit:
Sie müssen verwenden,
expand=True
wenn Ihre Zeichenfolgen eine ungleichmäßige Anzahl von Teilungen aufweisen und SieNone
die fehlenden Werte ersetzen möchten .Beachten Sie, dass die
.tolist()
Methode in beiden Fällen nicht erforderlich ist. Weder istzip()
.Im Detail:
Die Lösung von Andy Hayden ist hervorragend geeignet, um die Leistungsfähigkeit der
str.extract()
Methode zu demonstrieren .Für eine einfache Aufteilung über ein bekanntes Trennzeichen (z. B. Aufteilen durch Bindestriche oder Aufteilen durch Leerzeichen) reicht die
.str.split()
Methode jedoch aus 1 . Es verarbeitet eine Spalte (Serie) von Zeichenfolgen und gibt eine Spalte (Serie) von Listen zurück:1: Wenn Sie sich nicht sicher sind, was die ersten beiden Parameter
.str.split()
tun, empfehle ich die Dokumente für die einfache Python-Version der Methode .Aber wie geht es dir:
zu:
Nun, wir müssen uns das
.str
Attribut einer Spalte genauer ansehen .Es ist ein magisches Objekt, mit dem Methoden gesammelt werden, die jedes Element in einer Spalte als Zeichenfolge behandeln und dann die entsprechende Methode in jedem Element so effizient wie möglich anwenden:
Es hat aber auch eine "Indizierungs" -Schnittstelle, um jedes Element eines Strings anhand seines Index abzurufen:
Natürlich ist es dieser Indizierungsschnittstelle von
.str
egal, ob jedes zu indizierende Element tatsächlich eine Zeichenfolge ist, solange es indiziert werden kann.Dann ist es eine einfache Sache, das Python-Tupel zu nutzen, um iterables zu entpacken
Natürlich ist es so nützlich, einen DataFrame aus dem Teilen einer Zeichenfolgenspalte herauszuholen, dass die
.str.split()
Methode dies mit dem folgendenexpand=True
Parameter für Sie tun kann:Ein anderer Weg, um das zu erreichen, was wir wollten, ist:
Die
expand=True
Version ist zwar länger, hat aber einen deutlichen Vorteil gegenüber der Tupel-Entpackmethode. Das Auspacken von Tupeln eignet sich nicht für Splits unterschiedlicher Länge:Aber
expand=True
es geht gut, indem manNone
in die Spalten setzt, für die es nicht genug "Splits" gibt:quelle
.split()
Methode hinzugefügt, der die ersten beiden Parameter besser erklärt als die Pandas-Dokumente.df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
Sie können die verschiedenen Teile mit einem Regex-Muster ganz ordentlich extrahieren :
Um den etwas langen regulären Ausdruck zu erklären:
\d
) und benennt sie"fips"
.Der nächste Teil:
Hat entweder (
|
) eines von zwei Dingen:*
) von Großbuchstaben oder Leerzeichen ([A-Z ]
) und benennt diese"state"
vor dem Ende der Zeichenfolge ($
).oder
.*
)state_code
vor dem Ende der Zeichenfolge überein ($
).Im Beispiel:
Beachten Sie, dass die ersten beiden Zeilen den Status "State" (NaN in den Spalten "County" und "State_Code") und die letzten drei Zeilen "State_code" (NaN in der Spalte "State") treffen.
quelle
(?P<label>...)
Syntax erklärt ! Ich habe keine Ahnung, warum ich mich für die komplexere Regex entschieden habe, klar, die einfache könnte funktionieren hmmmm<group_name>
. Jetzt weiß ich, dass mein Code dadurch sehr prägnant wird.quelle
Wenn Sie keinen neuen Datenrahmen erstellen möchten oder wenn Ihr Datenrahmen mehr Spalten als nur die Spalten enthält, die Sie teilen möchten, können Sie:
quelle
zip argument #1 must support iteration
Fehlermeldung, Python 2.7Sie können
str.split
durch Leerzeichen (Standardtrennzeichen) und Parameterexpand=True
für dasDataFrame
Zuweisen zu neuen Spalten verwenden:Änderung bei Bedarf Originalspalte mit entfernen
DataFrame.pop
Wie ist das gleiche wie:
Wenn Fehler auftreten:
Sie können überprüfen und es gibt 4 Spalten zurück
DataFrame
, nicht nur 2:Dann wird die Lösung neu angehängt
DataFrame
durchjoin
:Mit Originalspalte entfernen (falls noch weitere Spalten vorhanden sind):
quelle
Wenn Sie eine Zeichenfolge basierend auf einem Trennzeichen in mehr als zwei Spalten aufteilen möchten, können Sie den Parameter 'Maximum Splits' weglassen.
Sie können verwenden:
Dadurch werden automatisch so viele Spalten erstellt, wie die maximale Anzahl von Feldern in einer Ihrer anfänglichen Zeichenfolgen enthalten ist.
quelle
Überrascht habe ich diesen noch nicht gesehen. Wenn Sie nur zwei Teilungen benötigen , kann ich nur empfehlen. . .
Series.str.partition
partition
führt einen Split am Separator durch und ist im Allgemeinen ziemlich performant.Wenn Sie die Zeilen umbenennen müssen,
Wenn Sie dies wieder mit dem Original verbinden müssen, verwenden Sie
join
oderconcat
:quelle
Ich ziehe den Export die entsprechende Pandas Serie (dh die Spalten ich brauche), indem die Anwendung Funktion den Spalteninhalt in mehrere Reihen zu spalten und dann kommt die erzeugten Spalten an den vorhandenen Datenrahmen. Natürlich sollte die Quellenspalte entfernt werden.
z.B
Um zwei Wörter zu teilen, sollte die Strings-Funktion ungefähr so aussehen:
quelle
Ich habe gesehen, dass niemand die Slice-Methode angewendet hat, also habe ich hier meine 2 Cent hier abgelegt.
Diese Methode erstellt zwei neue Spalten.
quelle
Verwenden Sie
df.assign
diese Option , um eine neue df zu erstellen. Siehe http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copyquelle