使用mode()填充NAN数据不起作用-Pandas

时间:2016-07-06 12:05:26

标签: python pandas machine-learning nan

我有一个数据集,其中有一个名为Outlet_Size的系列,其中包含{'Medium', nan, 'High', 'Small'}左右的2566条记录中的任何一条,所以我想用mode()值填充它,所以我写了一些东西像这样:

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

但是当我试图通过命令

找到缺少NaN记录的数量时
  sum(train['Outlet_Size'].isnull()) 

它仍然显示2566个NaN记录。为什么会这样?

感谢您的回答

1 个答案:

答案 0 :(得分:6)

这里的问题是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

它是一个系列,虽然只有一行,所以当你把它传递给fillna它只填充第一行,所以你想要的是通过索引到{{1来获得标量值}}:

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

您可以看到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 被忽略