Подтвердить что ты не робот

Pandas разбитый столбец списков на несколько столбцов

У меня есть панда 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 и team2, используя панд.

4b9b3361

Ответ 1

Вы можете использовать конструктор 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

Ответ 2

Гораздо более простое решение:

pd.DataFrame(df2.teams.tolist(), columns=['team1', 'team2'])

Урожайность,

  team1 team2
-------------
0    SF   NYG
1    SF   NYG
2    SF   NYG
3    SF   NYG
4    SF   NYG
5    SF   NYG
6    SF   NYG
7    SF   NYG

Если вы хотите разделить столбец строк с разделителями, а не списков, вы можете сделать то же самое:

pd.DataFrame(df.teams.str.split('<delim>', expand=True).values,
             columns=['team1', 'team2'])

Ответ 3

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

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

Ответ 4

Это решение сохраняет индекс DataFrame df2, в отличие от любого решения, использующего tolist():

df3 = df2.teams.apply(pd.Series)
df3.columns = ['team1', 'team2']

Вот результат:

  team1 team2
0    SF   NYG
1    SF   NYG
2    SF   NYG
3    SF   NYG
4    SF   NYG
5    SF   NYG
6    SF   NYG