2016-02-18 5 views
20

у меня есть панд dataFrame с одного столбца, который выглядит следующим образом:Панды разделить столбец списка на несколько столбцов

` 
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] 
` 

Мне нужно разделить этот столбец списков в 2 колонки по имени TEAM1 и Команда2 с помощью панд

ответ

39

Вы можете использовать DataFrame конструктор с lists созданного путем преобразования в numpy array по values с 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 

А для нового 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 

Решение с apply(pd.Series) очень медленно:

#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

Что будет, если имя столбца имеет пространство, например «команда 1». Я попытался получить доступ к значению столбца таким образом ** df2 ['team 1'] **, но он не работает. – Sherlock

+0

Я думаю, что это тоже хорошо. – jezrael

+0

Незначительное предупреждение, если вы используете его на существующем фрейме данных, обязательно сбросьте индекс, иначе он не будет правильно назначен. – user1700890

2

Там, кажется, синтаксически простой способ, и, следовательно, легче запомнить, в отличие от предлагаемых решений. Я предполагаю, что столбец называется «meta» в dataframe df:

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

У меня ошибка, но я разрешил ее, удалив 'str.split()'. Это было намного проще и имеет преимущество, если вы не знаете количество элементов в своем списке. – otteheng

Смежные вопросы