2017-02-22 132 views
0

Numpy int数组无法存储缺失值。int数组缺失值numpy

>>> import numpy as np 
>>> np.arange(10) 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> myArray = np.arange(10) 
>>> myArray.dtype 
dtype('int32') 

>>> myArray[0] = None 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType' 

>>> myArray.astype(dtype = 'float') 
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 
>>> myFloatArray = myArray.astype(dtype = 'float') 
>>> myFloatArray[0] = None 

>>> myFloatArray 
array([ nan, 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

熊猫警告有关此内容的文档 - Caveats and Gotchas, Support for int NA。 Wes McKinney也重申了这一点stack question

我需要能够将缺失值存储在int数组中。我将行插入到我设置的数据库中,只接受不同大小的整数。

我目前的工作是将数组存储为一个对象,该对象可以将int和None类型作为元素存储。

>>> myArray.astype(dtype = 'object') 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=object) 
>>> myObjectArray = myArray.astype(dtype = 'object') 
>>> myObjectArray[0] = None 
>>> myObjectArray 
array([None, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=object) 

这对于大型数据集似乎是内存密集型和缓慢的。我想知道是否有人有更好的解决方案,而numpy的开发正在进行中。

+1

'numpy.ma.MaskedArray'呢? – MSeifert

+0

有趣。你知道它是否适用于熊猫? – Nirvan

+1

这可能有点哈克。你不能指定一个指定的整数来填补这些缺失的值吗?您可以保留这样一个整数来仅填充缺失的值。为什么你只想插入'None'来代替缺失值? – kmario23

回答

0

我发现了一种非常快速的方法来将我的数据框中的所有缺失值转换为无类型。 .where方法

mydata = mydata.where(pd.notnull(mydata), None) 

这比我之前做的内存密集程度少得多。