You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:02:28