【发布时间】:2015-08-06 08:50:07
【问题描述】:
我有一个 dtype=object 数组,其中的值是 Python 列表或 np.nan。
我想将 np.nan 的值替换为 [None](不是 None)。
对于纯 Python 列表,我已经可以使用 [ x if (x is not np.nan) else [None] for x in s ] 来完成此操作,并且将数组转换为列表对我的目的来说很好,但出于好奇,我想知道如何使用 numpy 数组来完成此操作。困难在于,当使用索引时,numpy 试图将任何列表解释为值列表,而不是我想要分配的实际值。
例如,如果我想用2 替换值,这很容易(正常的 np、pd 导入;顺便说一句,np.isnan 在这种情况下不起作用,这是选择 float NaN 的一个弱点对于 pandas 中的通用缺失值,所以我使用 pd.isnull,因为无论如何这都是 pandas 内部的问题):
In [53]: s
Out[53]:
array([['asdf', 'asdf'], ['asdf'], nan, ['asdf', 'asdf', 'asdf'],
['asdf', 'asdf', 'asdf']], dtype=object)
In [55]: s[pd.isnull(s)] = 2
In [56]: s
Out[56]:
array([['asdf', 'asdf'], ['asdf'], 2, ['asdf', 'asdf', 'asdf'],
['asdf', 'asdf', 'asdf']], dtype=object)
然而,试图用 [None] 替换它们而不是用 None 替换它们:
In [58]: s
Out[58]:
array([['asdf', 'asdf'], ['asdf'], nan, ['asdf', 'asdf', 'asdf'],
['asdf', 'asdf', 'asdf']], dtype=object)
In [59]: s[pd.isnull(s)] = [None]
In [60]: s
Out[60]:
array([['asdf', 'asdf'], ['asdf'], None, ['asdf', 'asdf', 'asdf'],
['asdf', 'asdf', 'asdf']], dtype=object)
显然,这是人们 99% 的时间想要的行为。碰巧这一次,我想将列表分配为一个对象。有什么办法吗?
【问题讨论】:
-
您总是可以将列表显式包装为一个恰好是列表的对象的标量数组,就像您包装
s本身一样。但这太丑陋了;希望有人有更好的答案…… -
如果所有元素都是
lists,你可以就地改变列表(使用[:] = …),但遗憾的是这在这里没有帮助,因为你显然不能将nan原地变异为[None]。