2017-05-27 41 views
4

我有一個數據幀,其中有20列左右的列。其中一列稱爲'director_name',並具有諸如'John Doe'或'Jane Doe'等值。我想把它分成兩列,'First_Name'和'Last_Name'。當我運行以下它能正常工作並拆分字符串轉換成2列:將函數添加到熊貓中的字符串拆分命令中

data[['First_Name', 'Last_Name']] = data.director_name.str.split(' ', expand 
= True) 
data 

First_Name Last_Name 
John   Doe 

它的偉大工程,但它不,當我有下「director_name」 NULL(NAN)值工作。它引發以下錯誤:

'Columns must be same length as key' 

我想補充哪些檢查功能,如果值= null,則做上面列出的命令,否則輸入「NA」將First_Name爲和「姓氏」

任何想法我會怎麼做?

編輯:

我剛纔檢查的文件,我不知道,如果是空的問題。我有一些3-4個字符串的名字。即

John Allen Doe 
John Allen Doe Jr 

也許我不能把它分成First_Name和Last_Name。

Hmmmm

+1

這對我的作品。你使用的是什麼版本的熊貓/蟒蛇? –

+0

Python 3,Pandas 0.20.1。它有效,當你有空值?我認爲這就是爲什麼我的錯誤顯示。也許是其他原因?文件有5k條記錄,當我做.head(10)和所有值都有效時,當我打開它的整個文件(在'director_name'中有NULL值)它不是 – JD2775

+0

錯誤是因爲某些字段將有不止一個空間,我已經更新了您的上一個問題的答案,以處理那個 – Vaishali

回答

7

這裏有一個辦法就是分裂,並選擇說前兩個值作爲姓氏和名字

Id name 
0 1 James Cameron 
1 2 Martin Sheen 
2 3 John Allen Doe 
3 4 NaN 


df['First_Name'] = df.name.str.split(' ', expand = True)[0] 
df['Last_Name'] = df.name.str.split(' ', expand = True)[1] 

你得到

Id name   First_Name Last_Name 
0 1 James Cameron James  Cameron 
1 2 Martin Sheen Martin  Sheen 
2 3 John Allen Doe John  Allen 
3 4 NaN    NaN   None 
+1

這很完美。謝謝A-Z – JD2775

1

這應該可以解決您的問題

設置

data= pd.DataFrame({'director_name': {0: 'John Doe', 1: np.nan, 2: 'Alan Smith'}}) 

data 
Out[457]: 
    director_name 
0  John Doe 
1   NaN 
2 Alan Smith 

解決方案

#use a lambda function to check nan before splitting the column. 
data[['First_Name', 'Last_Name']] = data.apply(lambda x: pd.Series([np.nan,np.nan] if pd.isnull(x.director_name) else x.director_name.split()), axis=1) 

data 
Out[446]: 
    director_name First_Name Last_Name 
0  John Doe  John  Doe 
1   NaN  NaN  NaN 
2 Alan Smith  Alan  Smith 

如果你需要採取只有第2吶MES,你可以這樣做:

data[['First_Name', 'Last_Name']] = data.apply(lambda x: pd.Series([np.nan,np.nan] if pd.isnull(x.director_name) else x.director_name.split()).iloc[:2], axis=1) 
+0

謝謝艾倫!記下所有這些解決方案以備將來參考。 – JD2775

2

使用str.split(沒有參數,因爲默認分隔符爲空白)與indexing with str有關位置選擇列表:

print (df.name.str.split()) 
0  [James, Cameron] 
1  [Martin, Sheen] 
2 [John, Allen, Doe] 
3     NaN 
Name: name, dtype: object 

df['First_Name'] = df.name.str.split().str[0] 
df['Last_Name'] = df.name.str.split().str[1] 

#data borrow from A-Za-z answer 
print (df) 
    Id   name First_Name Last_Name 
0 1 James Cameron  James Cameron 
1 2 Martin Sheen  Martin  Sheen 
2 3 John Allen Doe  John  Allen 
3 4    NaN  NaN  NaN 

也有可能使用放慢參數n選擇第二或第一2名:

df['First_Name'] = df.name.str.split().str[0] 
df['Last_Name'] = df.name.str.split(n=1).str[1] 
print (df) 
    Id   name First_Name Last_Name 
0 1 James Cameron  James Cameron 
1 2 Martin Sheen  Martin  Sheen 
2 3 John Allen Doe  John Allen Doe 
3 4    NaN  NaN  NaN 

解決方案與str.rstrip

df['First_Name'] = df.name.str.rsplit(n=1).str[0] 
df['Last_Name'] = df.name.str.rsplit().str[-1] 
print (df) 
    Id   name First_Name Last_Name 
0 1 James Cameron  James Cameron 
1 2 Martin Sheen  Martin  Sheen 
2 3 John Allen Doe John Allen  Doe 
3 4    NaN   NaN  NaN 
+0

好東西,謝謝jezrael – JD2775

+0

有一個簡單的規則 - 如果使用標準的熊貓功能,那麼'NaN's可以很好地工作;)祝你好運! – jezrael

1
df['First_Name'] = df.name.str.split(' ', expand = True)[0] 
df['Last_Name'] = df.name.str.split(' ', expand = True)[1] 

這應該做

相關問題