374 Stimmen

Wie teilt man eine String-Spalte eines Datenrahmens in zwei Spalten?

Ich habe einen Datenrahmen mit einer (String-)Spalte und möchte ihn in zwei (String-)Spalten aufteilen, wobei eine Spaltenüberschrift als ' fips' und das andere 'row'

Mein Datenrahmen df sieht so 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 man df.row.str[:] um mein Ziel der Aufteilung der Zeilenzelle zu erreichen. Ich kann verwenden df['fips'] = hello um eine neue Spalte hinzuzufügen und sie zu füllen mit 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

26voto

keberwein Punkte 526

Wenn Sie keinen neuen Datenrahmen erstellen möchten oder Ihr Datenrahmen mehr Spalten als nur die, die Sie aufteilen möchten, enthält, können Sie dies tun:

df["flips"], df["row_name"] = zip(*df["row"].str.split().tolist())
del df["row"]

14voto

weaming Punkte 4377

Utilice df.assign um ein neues df zu erstellen. Siehe https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.assign.html

split = df_selected['name'].str.split(',', 1, expand=True)
df_split = df_selected.assign(first_name=split[0], last_name=split[1])
df_split.drop('name', 1, inplace=True)

Oder in Form einer Methodenkette:

df_split = (df_selected
            .assign(list_col=lambda df: df['name'].str.split(',', 1, expand=False),
                    first_name=lambda df: df.list_col.str[0],
                    last_name=lambda df: df.list_col.str[1])
            .drop(columns=['list_col']))

12voto

Mewtwo Punkte 1151

Wenn Sie eine Zeichenkette anhand eines Trennzeichens in mehr als zwei Spalten aufteilen möchten, können Sie den Parameter "maximum splits" weglassen.
Sie können verwenden:

df['column_name'].str.split('/', expand=True)

Dadurch werden automatisch so viele Spalten erstellt, wie die maximale Anzahl von Feldern in einer Ihrer ursprünglichen Zeichenfolgen enthalten ist.

11voto

cs95 Punkte 325143

Ich bin überrascht, dass ich das noch nicht gesehen habe. Wenn Sie nur brauchen zwei Spagat, kann ich nur empfehlen. . .

Series.str.partition

partition führt einen Split auf dem Separator durch und ist im Allgemeinen recht performant.

df['row'].str.partition(' ')[[0, 2]]

       0                   2
0  00000       UNITED STATES
1  01000             ALABAMA
2  01001  Autauga County, AL
3  01003  Baldwin County, AL
4  01005  Barbour County, AL

Wenn Sie die Zeilen umbenennen müssen,

df['row'].str.partition(' ')[[0, 2]].rename({0: 'fips', 2: 'row'}, axis=1)

    fips                 row
0  00000       UNITED STATES
1  01000             ALABAMA
2  01001  Autauga County, AL
3  01003  Baldwin County, AL
4  01005  Barbour County, AL

Wenn Sie dies wieder mit dem Original verbinden müssen, verwenden Sie join o concat :

df.join(df['row'].str.partition(' ')[[0, 2]])

pd.concat([df, df['row'].str.partition(' ')[[0, 2]]], axis=1)

                        row      0                   2
0       00000 UNITED STATES  00000       UNITED STATES
1             01000 ALABAMA  01000             ALABAMA
2  01001 Autauga County, AL  01001  Autauga County, AL
3  01003 Baldwin County, AL  01003  Baldwin County, AL
4  01005 Barbour County, AL  01005  Barbour County, AL

3voto

VingtCent Punkte 1864

Ich habe gesehen, dass noch niemand die Slice-Methode verwendet hat, also lege ich hier meine 2 Cents dazu.

df["<col_name>"].str.slice(stop=5)
df["<col_name>"].str.slice(start=6)

Mit dieser Methode werden zwei neue Spalten erstellt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X