这里的问题是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被忽略了