我有几个可变长度的列表,有些是空的。一个例子是:
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
:
我需要每个列表中的最后一项,这很简单:
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。在
从本质上讲,这真的是一个裸体问题,而不是熊猫问题。在
map
迭代列中的值,一次一个地传递给lambda
函数。在底层,pandas中的列/序列只是NumPy数组的(片段),因此pandas定义了以下helper function以从函数的底层数组中获取值。它由map
在每次迭代中调用:{cd4}是一个返回一个标量值的函数。在
组成函数的代码太长,无法在此处发布,但是here's在代码库中的何处可以找到它。我们只需要知道它返回的标量将与它所使用的数组的数据类型相匹配。在
回到您的系列:}数据类型。这意味着
^{pr2}$s0
有object
数据类型,而s1
有{PyArray_Scalar
将为每个序列返回不同类型的标量;实际的Pythonfloat
对象和NumPy标量float对象:NaN
值作为两种不同的类型返回,因此当您尝试使用lambda
函数对它们进行索引时,会出现不同的错误。在相关问题 更多 >
编程相关推荐