Sie können den DataFrame
Konstruktor verwenden mit lists
erstellt von to_list
:
import pandas as pd
d1 = {'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],
['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG']]}
df2 = pd.DataFrame(d1)
print (df2)
teams
0 [SF, NYG]
1 [SF, NYG]
2 [SF, NYG]
3 [SF, NYG]
4 [SF, NYG]
5 [SF, NYG]
6 [SF, NYG]
df2[['team1','team2']] = pd.DataFrame(df2.teams.tolist(), index= df2.index)
print (df2)
teams team1 team2
0 [SF, NYG] SF NYG
1 [SF, NYG] SF NYG
2 [SF, NYG] SF NYG
3 [SF, NYG] SF NYG
4 [SF, NYG] SF NYG
5 [SF, NYG] SF NYG
6 [SF, NYG] SF NYG
Und für neue DataFrame
:
df3 = pd.DataFrame(df2['teams'].to_list(), columns=['team1','team2'])
print (df3)
team1 team2
0 SF NYG
1 SF NYG
2 SF NYG
3 SF NYG
4 SF NYG
5 SF NYG
6 SF NYG
Lösung mit apply(pd.Series)
ist sehr langsam:
#7k rows
df2 = pd.concat([df2]*1000).reset_index(drop=True)
In [121]: %timeit df2['teams'].apply(pd.Series)
1.79 s ± 52.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [122]: %timeit pd.DataFrame(df2['teams'].to_list(), columns=['team1','team2'])
1.63 ms ± 54.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
df2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
apply()
möglicherweise langsamer, aber es ist die Go-to-Methode, wenn Eingabezeichenfolge und Werte in den Zeilen der Originalserie nicht gleich sind!Viel einfachere Lösung:
Erträge,
Wenn Sie eine Spalte mit begrenzten Zeichenfolgen anstelle von Listen teilen möchten, können Sie Folgendes tun:
quelle
df["teams"].str.split('<delim>', expand=True)
teilen möchten , können Sie dies auf ähnliche Weise tun: Gibt bereits einen DataFrame zurück, sodass es wahrscheinlich einfacher wäre, die Spalten einfach umzubenennen.Diese Lösung
df2
behält den Index des DataFrame bei, im Gegensatz zu jeder Lösung, die Folgendes verwendettolist()
:Hier ist das Ergebnis:
quelle
apply
Sie in Pandas tun können. Sie sollten diese Methode vermeiden und die akzeptierte Antwort verwenden. In den Zeiten der Top-Antwort ist diese Methode ca.1400 x
langsamer @rajanapply
Methode zuverlässiger zum Erweitern großer Arrays (über 1000 Elemente) in großen Datenmengen funktioniert. Dietolist()
Methode hat meinen Prozess abgebrochen, als der Datensatz 500.000 Zeilen überschritten hat.pd.DataFrame(df["teams"].to_list(), columns=["team_1", "team_2"])
wirklich so viel komplizierter?Es scheint einen syntaktisch einfacheren und daher leichter zu merkenden Weg zu geben als die vorgeschlagenen Lösungen. Ich gehe davon aus, dass die Spalte in einem Datenrahmen df 'meta' heißt:
quelle
str.split()
. Dies war viel einfacher und hat den Vorteil, wenn Sie die Anzahl der Elemente in Ihrer Liste nicht kennen.Basierend auf den vorherigen Antworten ist hier eine andere Lösung, die das gleiche Ergebnis wie df2.teams.apply (pd.Series) mit einer viel schnelleren Laufzeit zurückgibt:
Timings:
quelle
Die oben genannten Lösungen haben bei mir nicht funktioniert, da ich
nan
Beobachtungen in meinem habedataframe
. In meinem Falldf2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
ergibt:Ich löse dies mit Listenverständnis. Hier das replizierbare Beispiel:
Ausgabe:
Lösen mit Listenverständnis:
Ausbeuten:
quelle
Listenverständnis
einfache Implementierung mit Listenverständnis (mein Favorit)
Timing am Ausgang:
Ausgabe:
quelle