2014-04-26 5 views
37

Ho un dataframe panda con una colonna denominata "Città, stato, Paese". Voglio separare questa colonna in tre nuove colonne: "Città", "Stato" e "Paese".Pandas Dataframe: colonna divisa in più colonne, allineamento delle celle incoerente con allineamento a destra

0     HUN 
1     ESP 
2     GBR 
3     ESP 
4     FRA 
5    ID, USA 
6    GA, USA 
7 Hoboken, NJ, USA 
8    NJ, USA 
9     AUS 

Splitting colonna in tre colonne è abbastanza banale:

location_df = df['City, State, Country'].apply(lambda x: pd.Series(x.split(','))) 

Tuttavia, questo crea dei dati allineato a sinistra:

 0  1  2 
0 HUN  NaN  NaN 
1 ESP  NaN  NaN 
2 GBR  NaN  NaN 
3 ESP  NaN  NaN 
4 FRA  NaN  NaN 
5 ID  USA  NaN 
6 GA  USA  NaN 
7 Hoboken NJ  USA 
8 NJ  USA  NaN 
9 AUS  NaN  NaN 

Come si potrebbe fare per creare le nuove colonne con i dati allineati a destra? Avrei bisogno di scorrere tutte le righe, contare il numero di virgole e gestire i contenuti singolarmente?

risposta

43

farei qualcosa come il seguente:

foo = lambda x: pd.Series([i for i in reversed(x.split(','))]) 
rev = df['City, State, Country'].apply(foo) 
print rev 

     0 1  2 
0 HUN NaN  NaN 
1 ESP NaN  NaN 
2 GBR NaN  NaN 
3 ESP NaN  NaN 
4 FRA NaN  NaN 
5 USA ID  NaN 
6 USA GA  NaN 
7 USA NJ Hoboken 
8 USA NJ  NaN 
9 AUS NaN  NaN 

Penso che si ottiene ciò che si vuole, ma se si desidera anche le cose belle e ottenere una Città, Stato, Paese ordine delle colonne, si potrebbe aggiungere il seguente:

rev.rename(columns={0:'Country',1:'State',2:'City'},inplace=True) 
rev = rev[['City','State','Country']] 
print rev 

    City State Country 
0  NaN NaN  HUN 
1  NaN NaN  ESP 
2  NaN NaN  GBR 
3  NaN NaN  ESP 
4  NaN NaN  FRA 
5  NaN ID  USA 
6  NaN GA  USA 
7 Hoboken NJ  USA 
8  NaN NJ  USA 
9  NaN NaN  AUS 
6

Dal momento che avete a che fare con le stringhe vorrei suggerire la modifica al codice corrente cioè

location_df = df[['City, State, Country']].apply(lambda x: pd.Series(str(x).split(','))) 

Ho fatto lavorare il mio testando una delle colonne, ma provatelo.