2016-02-18 31 views
20

ho un dataframe panda con una colonna che è simile al seguente:Pandas divisi colonna delle liste in più colonne

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

ho bisogno di dividere questa colonna delle liste in 2 colonne denominate Team1 e Team2 utilizzando panda

risposta

39

È possibile utilizzare DataFrame costruttore con lists realizzato convertendo a numpy array da values con 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 

e per i nuovi 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 

Soluzione con apply(pd.Series) è molto lenta:

#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

E se il nome della colonna ha spazio, come "squadra 1". Ho provato ad accedere al valore della colonna in questo modo ** df2 ['team 1'] ** ma non funziona. – Sherlock

+0

Penso che funzioni anche bene. – jezrael

+0

Attenzione minima, se la stai usando su un dataframe esistente, assicurati di reimpostare l'indice, altrimenti non verrà assegnato correttamente. – user1700890

2

Sembra che ci sia un modo sintatticamente più semplice, e quindi più facile da ricordare, al contrario delle soluzioni proposte. Suppongo che la colonna si chiami "meta" in un dataframe df:

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

Ho ricevuto un errore ma l'ho risolto rimuovendo 'str.split()'. Questo è stato molto più semplice e ha il vantaggio se non si conosce il numero di elementi nella tua lista. – otteheng

Problemi correlati