2016-02-18 13 views
20

Mam dataFrame pandy z jednej kolumny, która wygląda następująco:Pandy podzielone kolumnę list w wielu kolumnach

` 
In [207]:df2.teams 
Out[207]: 
0   [SF, NYG] 
1   [SF, NYG] 
2   [SF, NYG] 
3   [SF, NYG] 
4   [SF, NYG] 
5   [SF, NYG] 
6   [SF, NYG] 
7   [SF, NYG] 
` 

muszę podzielić tę kolumnę list na 2 kolumnach nazwanych TEAM1 i team2 użyciu pandy

Odpowiedz

39

można użyć DataFrame konstruktora z lists stworzonej przez konwersję do numpy array przez values z tolist:

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.values.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 

I dla nowej DataFrame:

df3 = pd.DataFrame(df2['teams'].values.tolist(), 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 powolny:

#7k rows 
df2 = pd.concat([df2]*1000).reset_index(drop=True) 

In [89]: %timeit df2['teams'].apply(pd.Series) 
1 loop, best of 3: 1.15 s per loop 

In [90]: %timeit pd.DataFrame(df2['teams'].values.tolist(), columns=['team1','team2']) 
1000 loops, best of 3: 820 µs per loop 
+0

co jeśli nazwa kolumny zawiera spację, np. "Zespół 1". Próbowałem w ten sposób uzyskać dostęp do wartości kolumny ** df2 ['team 1'] **, ale to nie działa. – Sherlock

+0

Myślę, że to też działa fajnie. – jezrael

+0

Drobne zastrzeżenie, jeśli używasz go na istniejącej ramie danych, upewnij się, że resetujesz indeks, w przeciwnym razie nie zostanie przypisany poprawnie. – user1700890

2

Wydaje się być składniowo prostszy sposób, a więc łatwiejsze do zapamiętania, w przeciwieństwie do proponowanych rozwiązań. Zakładam, że kolumna nazywa się "meta" w ramce danych df:

df2 = pd.DataFrame(df['meta'].str.split().values.tolist()) 
+0

Wystąpił błąd, ale rozwiązałem go, usuwając 'str.split()'. To było znacznie prostsze i ma tę zaletę, jeśli nie znasz liczby pozycji na liście. – otteheng

Powiązane problemy