pandas.cut()带有NA值,导致“NA的布尔值不明确”

evrscar2  于 2023-01-24  发布在  其他
关注(0)|答案(2)|浏览(224)

我想理解为什么这段代码会引发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。
根据我对文档的理解,这不应该引发错误。

ovfsdjhp

ovfsdjhp1#

看起来pd.cut在遇到(相对较新的)pd.NAand it's not the only one时行为不一致。
请花些时间来报告它,并将它与主要问题联系起来。
同时,您可以将值 Package 在IntegerArray中,这允许整数类型为空值:

# Using IntegerArray
In [1]: import pandas as pd

In [2]: pd.cut(x=pd.array([1, 2, pd.NA, 4, 5, 6, 7]), bins=3)
Out[2]:
[(0.994, 3.0], (0.994, 3.0], NaN, (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], (5.0, 7.0]]
Categories (3, interval[float64, right]): [(0.994, 3.0] < (3.0, 5.0] < (5.0, 7.0]]

或者如果你不喜欢使用实验性的API,你可以使用np.array,尽管这会将dtype改为float:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: pd.cut(x=np.array([1, 2, np.nan, 4, 5, 6, 7]), bins=3)
Out[3]:
[(0.994, 3.0], (0.994, 3.0], NaN, (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], (5.0, 7.0]]
Categories (3, interval[float64, right]): [(0.994, 3.0] < (3.0, 5.0] < (5.0, 7.0]]

希望这个有用。

s6fujrry

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_cutsids = ensure_platform_int(bins.searchsorted(x, side=side))行失败,其中xbins 条件(标记)之一。
然后,深入研究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)......这确实是不明确的,并且会失败,并出现相应的错误。

In [372]: 1 <= pd.NA
Out[372]: <NA>

相关问题