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

2024-06-02 04:45:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,其中有一个称为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个南记录。为什么是这样?

谢谢你的回答


Tags: 数据命令内容sizemode记录train序列
1条回答
网友
1楼 · 发布于 2024-06-02 04:45:17

这里的问题是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时,它只填充第一行,所以您需要通过索引到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

可以看到NaN被忽略

相关问题 更多 >