Вы можете использовать DataFrame
конструктор, lists
созданный 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
И для новых 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
Решение с apply(pd.Series)
очень медленным:
#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()
может быть медленнее, но это лучший метод, когда входная строка и значения не равны в строках исходной серии!Гораздо более простое решение:
Урожайность,
Если вы хотите разделить столбец строк с разделителями, а не списков, вы можете сделать то же самое:
источник
df["teams"].str.split('<delim>', expand=True)
уже возвращает DataFrame, поэтому, вероятно, было бы проще просто переименовать столбцы.Это решение сохраняет индекс
df2
DataFrame, в отличие от любого решения, в котором используютсяtolist()
:Вот результат:
источник
apply
вы можете сделать в пандах. Вам следует избегать этого метода и использовать принятый ответ. По1400 x
таймингу верхнего ответа этот метод примерно медленнее @rajanapply
метод более надежно работает при расширении больших массивов (более 1000 элементов) на больших наборах данных.tolist()
Метод убил мой процесс , когда набор данных превысил 500K строк.pd.DataFrame(df["teams"].to_list(), columns=["team_1", "team_2"])
все намного сложнее?Кажется, что существует более простой синтаксически и, следовательно, более простой для запоминания способ, в отличие от предлагаемых решений. Я предполагаю, что столбец называется «мета» в df фрейма данных:
источник
str.split()
. Это было намного проще и дает преимущество, если вы не знаете количество элементов в своем списке.Основываясь на предыдущих ответах, вот еще одно решение, которое возвращает тот же результат, что и df2.teams.apply (pd.Series), с гораздо более быстрым временем выполнения:
Тайминги:
источник
Вышеупомянутые решения не сработали для меня, так как у меня есть
nan
наблюдения в моемdataframe
. В моем случаеdf2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
дает:Я решаю это, используя понимание списка. Вот воспроизводимый пример:
вывод:
решение с пониманием списка:
выходы:
источник
понимание списка
простая реализация с пониманием списка (мой любимый)
время на выходе:
вывод:
источник
Вот еще одно решение с использованием
df.transform
иdf.set_index
:источник