使用 mode() 填充 NAN 数据不起作用 -Pandas
Filling NAN data with mode() doesn't work -Pandas
我有一个数据集,其中有一个名为 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 records.Why是这样吗?
感谢您的回答
这里的问题是 mode
returns 一个系列,这导致 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
returns:
In [196]:
df['a'].mode()
Out[196]:
0 medium
dtype: object
它是一个系列,尽管只有一行,所以当您将它传递给 fillna
时,它只填充第一行,所以您想要的是通过索引到 [=18= 来获取标量值]:
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
被忽略了
我有一个数据集,其中有一个名为 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 records.Why是这样吗?
感谢您的回答
这里的问题是 mode
returns 一个系列,这导致 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
returns:
In [196]:
df['a'].mode()
Out[196]:
0 medium
dtype: object
它是一个系列,尽管只有一行,所以当您将它传递给 fillna
时,它只填充第一行,所以您想要的是通过索引到 [=18= 来获取标量值]:
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
被忽略了