我有一个 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)
Run Code Online (Sandbox Code Playgroud)
然而,尝试用 [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)
Run Code Online (Sandbox Code Playgroud)
显然,99% 的情况下这是人们想要的行为。恰巧这一次,我想将列表分配为一个对象。有什么办法可以做到吗?
第一个问题是s[\xe2\x80\xa6] = [None]
尝试用一个值的序列 替换数组切片None
。您真正想要的是将切片替换为一个值的序列,[None]
您可以将其写为[[None]]
。
然而,这并不能真正解决你的问题;这只会让你找到你最初想问的问题。
\n\n您需要明确地拥有一个包含1 个元素的数组object
,该数组恰好是 list [None]
。例如:
>>> n = np.array([[None], 0], dtype=object)[:1]\n>>> s[pd.isnull(s)] = n\n
Run Code Online (Sandbox Code Playgroud)\n\n或者,当然:
\n\n>>> n = np.empty((1,), dtype=object)\n>>> n[0] = [None]\n>>> s[pd.isnull(s)] = n\n
Run Code Online (Sandbox Code Playgroud)\n\n我 90% 确信有一种更简洁、更易读的方法来创建保证具有 value 的 1 元素数组[None]
,并且 80% 确信有一种更简单的方法可以首先完成整个事情,所以希望有人会来有一个更好的答案\xe2\x80\xa6,但如果没有,这会起作用。