gpt4 book ai didi

python - pandas IndexError/TypeError 与 NaN 值不一致

转载 作者:太空狗 更新时间:2023-10-30 01:33:17 25 4
gpt4 key购买 nike

我有几个系列的可变长度列表,其中有一些空值。一个例子是:

In [108]: s0 = pd.Series([['a', 'b'],['c'],np.nan])
In [109]: s0
Out[109]:
0 [a, b]
1 [c]
2 NaN
dtype: object

但另一个包含所有 NaN:

In [110]: s1 = pd.Series([np.nan,np.nan])
In [111]: s1
Out[111]:
0 NaN
1 NaN
dtype: float64

我需要每个列表中的最后一项,这很简单:

In [112]: s0.map(lambda x: x[-1] if isinstance(x,list) else x)
Out[112]:
0 b
1 c
2 NaN
dtype: object

但是在谈到这一点时,我发现,如果没有 isinstance,当索引在 NaNs 上阻塞时 它在 s0< 上的表现非常不同s1:

In [113]: s0.map(lambda x: x[-1])
...
TypeError: 'float' object is not subscriptable

In [114]: s1.map(lamda x: x[-1])
...
IndexError: invalid index to scalar variable.

谁能解释一下为什么?这是一个错误吗?我正在使用 Pandas 0.16.2 和 Python 3.4.3。

最佳答案

从本质上讲,这实际上是一个 NumPy 问题,而不是 pandas 问题。

map 遍历列中的值,一次将它们传递给 lambda 函数。在下面,pandas 中的列/系列只是 NumPy 数组的(切片),因此 pandas 定义了以下 helper function从函数的底层数组中获取值。这由 map 在每次迭代时调用:

PANDAS_INLINE PyObject*
get_value_1d(PyArrayObject* ap, Py_ssize_t i) {
char *item = (char *) PyArray_DATA(ap) + i * PyArray_STRIDE(ap, 0);
return PyArray_Scalar(item, PyArray_DESCR(ap), (PyObject*) ap);
}

关键位是 PyArray_Scalar,这是一个 NumPy API 函数,它复制 NumPy 数组的一部分以返回标量值。

构成该函数的代码太长,无法贴在这里,但是here's在代码库中的哪里可以找到它。我们只需要知道它返回的标量将匹配它所使用的数组的数据类型。

回到你的系列:s0object dtype 而 s1float64 dtype。这意味着 PyArray_Scalar 将为每个系列返回不同类型的标量;分别是一个实际的 Python float 对象和一个 NumPy 标量浮点对象:

>>> type(s0[2])
float
>>> type(s1[0])
numpy.float64

NaN 值作为两种不同的类型返回,因此当您尝试使用 lambda 函数对它们进行索引时会出现不同的错误。

关于python - pandas IndexError/TypeError 与 NaN 值不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34398004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com