2016-07-06 60 views
2

我有一個數據集,其中有一系列被稱爲Outlet_Size其中包含{'Medium', nan, 'High', 'Small'}約2566記錄丟失,所以我想用它填充模式()值,所以我寫了這樣的事情:使用模式()填充NAN數據不起作用-Pandas

train['Outlet_Size']=train['Outlet_Size'].fillna(train['Outlet_Size'].dropna().mode()] 

但是,當我試圖通過命令

sum(train['Outlet_Size'].isnull()) 

,仍呈現2566的NaN records.Why尋找失蹤的NaN記錄的數量會這樣呢?

謝謝你的答案

+0

它真的是數字'NaN'還是字符串''nan''?發佈原始數據和代碼來重現此 – EdChum

+0

該系列包含字符串值如「中等」'小',所以我想這將是字符串NaN.Btw如何檢查是哪個南? –

+0

'fillna'之前''train [train ['Outlet_Size']。isnull()]'會向您顯示真正的'NaN'行,如果它什麼都不顯示,那麼試試'train [train ['Outlet_Size'] ==' nan']' – EdChum

回答

4

這裏的問題是,mode返回一個系列,這是導致fillna失敗,如果我們看一個簡單的例子:

In [194]:  
df = pd.DataFrame({'a':['low','low',np.NaN,'medium','medium','medium','medium']}) 
df 

Out[194]: 
     a 
0  low 
1  low 
2  NaN 
3 medium 
4 medium 
5 medium 
6 medium 

In [195]:  
df['a'].fillna(df['a'].mode()) 

Out[195]: 
0  low 
1  low 
2  NaN 
3 medium 
4 medium 
5 medium 
6 medium 
Name: a, dtype: object 

所以你可以看到,它上面的失敗,如果我們看一下mode回報:

In [196]:  
df['a'].mode() 

Out[196]: 
0 medium 
dtype: object 

這是一個系列儘管有單排,所以當你p屁股這fillna它只是填充的第一行,所以你要的是通過索引進入Series獲得標量值:

In [197]:  
df['a'].fillna(df['a'].mode()[0]) 

Out[197]: 
0  low 
1  low 
2 medium 
3 medium 
4 medium 
5 medium 
6 medium 
Name: a, dtype: object 

編輯

關於是否dropna是必需的,沒有它不是「T:

In [204]: 
df = pd.DataFrame({'a':['low','low',np.NaN,'medium','medium','medium','medium',np.NaN,np.NaN,np.NaN,np.NaN]}) 
df['a'].mode() 

Out[204]: 
0 medium 
dtype: object 

你可以看到,NaN被忽略

+0

工作很好。請注意詳細說明爲什麼添加這個'[0]'排序問題?我個人認爲@dwanderson是正確的,我們必須首先放棄「NAN」,因爲如果NAN是多數模式,那麼如果錯誤返回NAN,我將會返回NAN。謝謝 –

+0

查看更新的答案,不需要它 – EdChum

+0

另外,如果我的答案解決了您的問題,那麼您可以接受它,我的答案左上角會有一個空的刻度標記 – EdChum