2014-04-26 11 views
37

Mam pandasową ramkę danych z kolumną o nazwie "City, State, Country". Chcę oddzielić tę kolumnę na trzy nowe kolumny: "Miasto", "Stan" i "Kraj".Pandas Dataframe: podzielona kolumna na wiele kolumn, niepasujące do prawej strony wpisy komórek

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 

Dzielenie kolumna na trzy kolumny wystarczy trywialny:

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

Jednak ta tworzy wyrównany do lewej dane:

 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 

Jak można o tworzenie nowych kolumn z dane wyrównane do prawej? Czy musiałbym iterować w każdym wierszu, policzyć liczbę przecinków i obsługiwać zawartość indywidualnie?

Odpowiedz

43

zrobiłbym coś jak następuje:

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 

myślę, że robi to, co chcesz, ale jeśli chcesz do pięknych rzeczy i uzyskać miasto, powiat, kraj kolejność kolumn, można dodaj następujące:

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

Ponieważ mamy do czynienia z tekstem chciałbym zaproponować poprawkę do swojego aktualnego kodu tj

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

Mam swoją pracę, testując jedną z kolumn, ale wypróbuj tę.