Você pode usar o DataFrame
construtor lists
criado por 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
E para novos 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
A solução com apply(pd.Series)
é muito lenta:
#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()
pode ser mais lento, mas é o método principal quando a string e os valores de entrada não são iguais nas linhas da série original!Solução muito mais simples:
Rendimentos,
Se você quiser dividir uma coluna de cadeias delimitadas em vez de listas, faça o mesmo:
fonte
df["teams"].str.split('<delim>', expand=True)
já retorna um DataFrame, portanto, provavelmente seria mais simples renomear as colunas.Esta solução preserva o índice do
df2
DataFrame, diferente de qualquer solução que usetolist()
:Aqui está o resultado:
fonte
apply
você pode fazer em pandas. Você deve evitar esse método e usar a resposta aceita. Nos tempos de resposta superior, este método é de aproximadamente1400 x
mais lento @rajanapply
método funciona de maneira mais confiável para expandir matrizes grandes (mais de 1.000 itens) em conjuntos de dados grandes. Otolist()
método interrompeu meu processo quando o conjunto de dados excedeu 500k linhas.pd.DataFrame(df["teams"].to_list(), columns=["team_1", "team_2"])
realmente muito mais complicado?Parece haver uma maneira sintaticamente mais simples e, portanto, mais fácil de lembrar, em oposição às soluções propostas. Estou assumindo que a coluna é chamada 'meta' em um dataframe df:
fonte
str.split()
. Isso foi muito mais simples e tem a vantagem se você não souber o número de itens em sua lista.Com base nas respostas anteriores, aqui está outra solução que retorna o mesmo resultado que df2.teams.apply (pd.Series) com um tempo de execução muito mais rápido:
Horários:
fonte
As soluções acima não funcionaram para mim, pois tenho
nan
observações no meudataframe
. No meu caso,df2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
produz:Eu resolvo isso usando a compreensão da lista. Aqui o exemplo replicável:
resultado:
resolução com compreensão de lista:
rendimentos:
fonte
compreensão da lista
implementação simples com compreensão de lista (o meu favorito)
tempo na saída:
resultado:
fonte
Aqui está outra solução usando
df.transform
edf.set_index
:fonte