這裏的問題是,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
被忽略
它真的是數字'NaN'還是字符串''nan''?發佈原始數據和代碼來重現此 – EdChum
該系列包含字符串值如「中等」'小',所以我想這將是字符串NaN.Btw如何檢查是哪個南? –
'fillna'之前''train [train ['Outlet_Size']。isnull()]'會向您顯示真正的'NaN'行,如果它什麼都不顯示,那麼試試'train [train ['Outlet_Size'] ==' nan']' – EdChum