Możesz użyć DataFrame
konstruktora z lists
utworzonym przez 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
A dla nowych 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
Rozwiązanie z apply(pd.Series)
jest bardzo powolne:
#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()
może być wolniejsze, ale jest metodą przechodzenia do, gdy ciąg wejściowy i wartości nie są równe w wierszach oryginalnej serii!Dużo prostsze rozwiązanie:
Plony,
Jeśli chcesz podzielić kolumnę rozdzielonych ciągów znaków zamiast list, możesz zrobić podobnie:
źródło
df["teams"].str.split('<delim>', expand=True)
już zwraca DataFrame, więc prawdopodobnie prościej byłoby po prostu zmienić nazwy kolumn.To rozwiązanie zachowuje indeks
df2
DataFrame, w przeciwieństwie do innych rozwiązań, które używajątolist()
:Oto wynik:
źródło
apply
jakie możesz zrobić w pandach. Powinieneś unikać tej metody i używać zaakceptowanej odpowiedzi. W czasie odpowiadającym najlepszej odpowiedzi ta metoda jest1400 x
mniej więcej wolniejsza @rajanapply
metoda działa bardziej niezawodnie w przypadku rozszerzania dużych tablic (ponad 1000 pozycji) na dużych zestawach danych. Tatolist()
metoda zabiła mój proces, gdy zestaw danych przekroczył 500 tys. Wierszy.pd.DataFrame(df["teams"].to_list(), columns=["team_1", "team_2"])
naprawdę jest o wiele bardziej skomplikowane?Wydaje się, że istnieje prostszy syntaktycznie sposób, a zatem łatwiejszy do zapamiętania, w przeciwieństwie do proponowanych rozwiązań. Zakładam, że kolumna nazywa się „meta” w df ramki danych:
źródło
str.split()
. Było to znacznie prostsze i ma tę zaletę, że nie znasz liczby pozycji na liście.W oparciu o poprzednie odpowiedzi, oto inne rozwiązanie, które zwraca ten sam wynik co df2.teams.apply (pd.Series) przy znacznie szybszym czasie działania:
Czasy:
źródło
Powyższe rozwiązania nie zadziałały, ponieważ mam
nan
spostrzeżenia w moimdataframe
. W moim przypadkudf2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
daje:Rozwiązuję to używając rozumienia listy. Oto przykład do odtworzenia:
wynik:
rozwiązywanie ze zrozumieniem listy:
plony:
źródło
rozumienie listy
prosta implementacja ze zrozumieniem listy (mój ulubiony)
czas na wyjściu:
wynik:
źródło
Oto inne rozwiązanie wykorzystujące
df.transform
idf.set_index
:źródło