在使用 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
就没有替换原来的 NaN
s
我做错了什么?
不要将 DataFrame.fillna
与 inplace=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'
奇怪的问题。
我有一个 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
就没有替换原来的 NaN
s
我做错了什么?
不要将 DataFrame.fillna
与 inplace=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'