Gab*_*nnu 4 python machine-learning nan pandas
我有一个数据集,其中有一个已知的系列Outlet_Size
包含{'Medium', nan, 'High', 'Small'}
大约2566个记录中的任何一个,所以我想用mode()值填充它所以我写了这样的东西:
train['Outlet_Size']=train['Outlet_Size'].fillna(train['Outlet_Size'].dropna().mode()]
Run Code Online (Sandbox Code Playgroud)
但是当我试图通过命令找到失踪的NaN记录数量时
sum(train['Outlet_Size'].isnull())
Run Code Online (Sandbox Code Playgroud)
它仍然显示2566 NaN记录.为什么会这样?
谢谢你的回答
这里的问题是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
Run Code Online (Sandbox Code Playgroud)
所以你可以看到它失败了,如果我们看看mode
返回的是什么:
In [196]:
df['a'].mode()
Out[196]:
0 medium
dtype: object
Run Code Online (Sandbox Code Playgroud)
它是一个系列,虽然只有一行,所以当你把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
Run Code Online (Sandbox Code Playgroud)
编辑
关于是否dropna
需要,不是不是:
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
Run Code Online (Sandbox Code Playgroud)
你可以看到它NaN
被忽略了