pandas.cut()含pandas.NA抛出TypeError的原因咨询
为什么pandas.cut传入含pandas.NA的数据会抛出TypeError?
问题代码
import pandas pandas.cut(x=[1, 2, pandas.NA, 4, 5, 6, 7], bins=3)
错误信息
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/user/.local/lib/python3.9/site-packages/pandas/core/reshape/tile.py", line 293, in cut fac, bins = _bins_to_cuts( File "/home/user/.local/lib/python3.9/site-packages/pandas/core/reshape/tile.py", line 428, in _bins_to_cuts ids = ensure_platform_int(bins.searchsorted(x, side=side)) File "pandas/_libs/missing.pyx", line 382, in pandas._libs.missing.NAType.__bool__ TypeError: boolean value of NA is ambiguous
问题背景
传入的数据包含pandas.NA,但查阅pandas.cut官方文档Notes部分说明:
任何NA值在结果中都会返回NA,超出边界的值在生成的Series或Categorical对象中也会返回NA。
按文档理解代码不应报错,因此咨询错误产生原因。
原因分析
这个错误是pandas版本兼容性问题:
- 你当前使用的pandas版本对
pandas.NA(Nullable类型缺失值)的支持不完善,cut方法内部调用的searchsorted无法正确处理pandas.NA——在底层判断pandas.NA的布尔值时,会触发"boolean value of NA is ambiguous"的错误。 - 文档描述的行为,针对的是传统的
np.nan缺失值,早期pandas版本对pandas.NA的处理逻辑没有跟上文档描述。
解决方案
- 升级pandas版本:升级到1.3.0及以上版本,该版本已修复
pandas.cut对pandas.NA的处理问题,能按照文档预期返回含NA的结果。 - 替换缺失值类型:将
pandas.NA替换为np.nan,旧版本pandas对np.nan的处理符合文档描述:import pandas as pd import numpy as np pd.cut(x=[1, 2, np.nan, 4, 5, 6, 7], bins=3) - 转换为Series处理:将输入的列表转为pandas Series,Series的缺失值处理逻辑更完善:
import pandas as pd pd.cut(pd.Series([1, 2, pd.NA, 4, 5, 6, 7]), bins=3)
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

