2017-05-25 45 views
2

我有一個柱(「位置」)數據幀一個具有大約由逗號分隔的城市和州信息。有些值是無。熊貓:使用適用於列分成2

我寫了一個函數將數據分成城市和國家,並清理了一點:

def split_data(x): 
    if x: 
     s = x.split(',') 
     city = s[0].lstrip().rstrip() 
     state = s[1].lstrip().rstrip() 
    else: 
     city = None 
     state = None 
    return city, state 

我有困難的時候搞清楚如何從這個函數創建2個單獨的列。 如果我使用以下命令:

df['location_info'] = df['location'].apply(split_data) 

它創建了一個元組進入「LOCATION_INFO」列。

什麼是數據幀創建2個新列的最佳途徑 - 一個叫做「城市」,另一個叫「國家」?

回答

3

我認爲你可以使用矢量功能str.splitstr.strip

df[['city','state']]=df['location'].str.split(',',expand=True).apply(lambda x: x.str.strip()) 

或者:

df[['city','state']] = df['location'].str.split(',', expand=True) 
df['city'] = df['city'].str.strip() 
df['state'] = df['state'].str.strip() 

樣品:

df = pd.DataFrame({'location':[' a,h ',' t ,u', None]}) 
print (df) 
    location 
0  a,h 
1  t ,u 
2  None 

df[['city','state']]=df['location'].str.split(',',expand=True).apply(lambda x: x.str.strip()) 
print (df) 
    location city state 
0  a,h  a  h 
1  t ,u  t  u 
2  None None None 

但是,如果確實需要使用的功能(例如是更復雜的)添加Series

def split_data(x): 
    if x: 
     s = x.split(',') 
     city = s[0].strip() 
     state = s[1].strip() 
    else: 
     city = None 
     state = None 
    return pd.Series([city, state], index=['city','state']) 

df[['city','state']] = df['location'].apply(split_data) 
print (df) 
    location city state 
0  a,h  a  h 
1  t ,u  t  u 
2  None None None 
+0

偉大的答案!不幸的是,我簡化了這個例子的功能,現在我不能推斷你的答案,我真正的問題。抱歉。其實,我有我使用另一個分裂(位置格式爲:高中在市,州),我只需要在城市和國家,所以我使用一個額外的分裂(「IN」)。謝謝。 –

+0

好,然後用你的函數'回報pd.Series([城市,州],指數= [ '城市', '國家'])'。 – jezrael