在使用 Mode 将 NaN 替换为最常见的列字符串值时,我无法让 Python 中的 Fillna 工作

I cannot get Fillna in Python to Work when using Mode to Replace NaNs with Most Frequent Column String Value

奇怪的问题。

我有一个 dtype == object dataframe 列,其中包含字符串值和 NaN。看起来像这样:

df   
     Response    
0    Email
1    NaN
2    NaN
3    Call
4    Email
5    Email

我想使用 fillna 用最常出现的值填充 NaN 值 - 在本例中为 'email'。

代码如下所示:

import numpy as np
import pandas as pd

most_frequent_cat = str(df['Response']).mode())
df['Response_imputed'] = df['Response']
df['Response_imputed'].fillna(most_freq_cat, inplace = True)

结果如下所示:

df   Response    

0    Email
1    0    Email\ndtype: object
2    0    Email\ndtype: object
3    Call
4    Email
5    Email

0 Email\ndtype: object 不同于 Email

如果我删除了 str 就没有替换原来的 NaNs

我做错了什么?

不要将 DataFrame.fillnainplace=True 一起使用。实际上I would recommend forgetting that argument exists entirely。请改用 Series.fillna,因为您只需要在一列上使用它并返回结果。

另外需要注意的是mode可以return多个模式,如果没有单一模式的话。在那种情况下,select 第一个或随机一个(适合您的练习)就足够了。

这是我推荐的语法:

# call fillna on the column and assign it back
df['Response'] = df['Response'].fillna(df['Response'].mode().iat[0])
df
 
  Response
0    Email
1    Email
2    Email
3     Call
4    Email
5    Email

如果您有多个要填充 NaN 的列,您也可以按列进行填充。程序再次类似,在列上调用模式,然后获取每列的第一个模式,这次将其用作 DataFeame.fillna 的参数:

df.fillna(df.mode().iloc[0])

  Response
0    Email
1    Email
2    Email
3     Call
4    Email
5    Email
import pandas as pd
d = {'Response': ['Email','NaN','NaN','Call','Email','Email']}
df = pd.DataFrame(data=d)

df['Response'].mode() 

输出:

0    Email
dtype: object

取第一行:

df['Response'].mode()[0] 

输出:

'Email'