我想理解为什么这段代码会引发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
当然,包含缺失值(pandom.NA)的值也是如此。但是在 * 注解 * 部分查找into the to docs。
任何NA值在结果中都将是NA。超出界限的值在结果系列或分类对象中将是NA。
根据我对文档的理解,这不应该引发错误。
2条答案
按热度按时间ovfsdjhp1#
看起来
pd.cut
在遇到(相对较新的)pd.NA
值and it's not the only one时行为不一致。请花些时间来报告它,并将它与主要问题联系起来。
同时,您可以将值 Package 在
IntegerArray
中,这允许整数类型为空值:或者如果你不喜欢使用实验性的API,你可以使用
np.array
,尽管这会将dtype改为float:希望这个有用。
s6fujrry2#
*...了解此代码引发
TypeError
* 的原因它的本质是
pd.NA
值(https://pandas.pydata.org/pandas-docs/version/1.0.0/user_guide/missing_data.html)。表示缺失值的实验NA标量
警告实验性:
pd.NA
的行为仍然可以在没有警告的情况下改变。...
通常,缺少值会在涉及
pd.NA
的运算中传播。当其中一个操作数未知时,运算的结果也未知。...
在相等和比较运算中,
pd.NA
也会传播。...
由于NA的实际值是未知的,因此将NA转换为布尔值是不明确的。以下情况会引发错误:
TypeError: boolean value of NA is ambiguous
pd.cut
在其内部_bins_to_cuts
函数中使用np.searchsorted
,在您的示例中,_bins_to_cuts
在ids = ensure_platform_int(bins.searchsorted(x, side=side))
行失败,其中x
是 bins 条件(标记)之一。然后,深入研究
np.searchsorted
:它在内部进行类似a[i-1] < v <= a[i]
/a[i-1] <= v < a[i]
的比较操作以找到插入索引。因此,对于输入列表
[1, 2, pd.NA, 4, 5, 6, 7]
,任何类似<value> <= pd.NA
的比较都会给予pd.NA
,而不是逻辑值(True/False
)......这确实是不明确的,并且会失败,并出现相应的错误。