为何Pandas的fillna方法无法处理pd.NA值?
问题原因分析
你的问题核心不在于pd.NA本身,而是众数结果的结构和fillna的预期不匹配:
df[bool_cols].mode()返回的是一个DataFrame(即使只有一个众数,它也是带有行索引的二维结构)。- 在Pandas 1.5.2中,当为
BooleanDtype类型的列(存储pd.NA)使用二维结构的DataFrame作为填充值时,fillna无法正确将填充值映射到对应列的缺失位置,导致pd.NA未被替换。
解决方案
不需要把pd.NA转为NaN,只需要从mode结果中提取每个列对应的众数标量,将二维的DataFrame转为一维的Series即可:
通过iloc[0]取出mode结果的第一行(如果存在多个众数,mode()会返回多行,这里取第一个众数即可),得到每个列对应的众数值组成的Series,再传入fillna就能正确填充pd.NA。
修改后的代码
import pandas as pd import numpy as np # 创建DataFrame df = pd.DataFrame({"a": [True, pd.NA, False, True], "b": [0, np.nan, 2, 3]}) # 转换数据类型(a变为布尔型,b变为Int64) df = df.convert_dtypes() # 获取布尔类型列 bool_cols = df.select_dtypes(include=bool).columns.tolist() # 获取众数:提取第一行的标量值组成Series most_frequent_values = df[bool_cols].mode().iloc[0] # 用列的众数填充缺失值 df[bool_cols] = df[bool_cols].fillna(most_frequent_values) # 打印结果 print(df)
验证输出
修改后运行代码,列a的pd.NA会被正确填充为众数True,输出如下:
a b 0 True 0 1 True 1 2 False 2 3 True 3
内容的提问来源于stack exchange,提问作者Flavio
相关产品推荐
相关产品推荐

