pandas索引器错误/TypeError与NaN值不一致

2024-04-25 12:27:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但另一个包含所有NaNs

^{pr2}$

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

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和{}的情况就大不相同了:

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和python3.4.3。在


Tags: lambdainmap列表objectnpnanout
1条回答
网友
1楼 · 发布于 2024-04-25 12:27:46

从本质上讲,这真的是一个裸体问题,而不是熊猫问题。在

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);
}

{cd4}是一个返回一个标量值的函数。在

组成函数的代码太长,无法在此处发布,但是here's在代码库中的何处可以找到它。我们只需要知道它返回的标量将与它所使用的数组的数据类型相匹配。在

回到您的系列:s0object数据类型,而s1有{}数据类型。这意味着PyArray_Scalar将为每个序列返回不同类型的标量;实际的Pythonfloat对象和NumPy标量float对象:

^{pr2}$

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

相关问题 更多 >