python:使用对象删除数组中的NaN值

时间:2017-04-10 09:07:04

标签: python arrays numpy nan

我是python的新手,但我想用python从文件中读取一些数据。我的问题是数据中有NaN值,我无法删除它们。用零替换它们也是一个想法。

我的数据如下:

>>> data
array(['123.6', 'NaN' , '124.5' , '8463.9' , .... , '764.8'],
      ['NaN', '763.9', ..., 'NaN'] , dtype=object] 

我用numpy数组创建了它。我的目标是在没有NaN值的情况下改造np.float。因此我认为用np.isnan(data)创建一个掩码是个好主意,但我得到以下错误

  

TypeError:ufunc' isnan'不支持输入类型,并且根据投射规则无法安全地将输入强制转换为任何支持的类型'''

然后我还有另一个想法如何解决这个问题。我考虑过使用np.setdiff1d(data,NaN)函数,因此我想用NaN-Values创建一个数组:

>>> NaN = np.array([NaN, NaN])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'NaN' is not defined

但我没有让它成功运作。

任何想法如何解决这个问题?

编辑I:

如果您想重新创建我的问题: - 我在评论结尾给你数据。 - 我的整个代码:

file = open('data.txt','r')
data = [ ]
for line in (x for x in file if not (x.startswith('#'))):
    line = line.strip().split(' ')
    data.append(line)
data = np.array(data)

此代码有效。但是,如果我尝试下一步data = data.astype(np.float),由于NaN值,它不起作用。

我原始数据的一部分,我保存为.txt文件。

1564.5  927.5   -33.217633987949434 -75.28690848012765  0.8646  0.8654  0.8041  0.8399  0.816   0.8157  0.8005  0.7783  0.7758  0.3526  0.0023  0.0513  0.0507  9.591876    121.94432   63.2077 64.7261 9.68262 118.91  9.48605 126.374 9.51632 124.666 9.55169 123.097 9.57373 122.254 9.59818 121.403 9.62448 120.563 9.50012 125.52  9.65311 119.719 9.71611 118.056 9.53956 123.598 9.59347 121.561 9.65895 119.555
1565.5  927.5   -33.215517631467705 -75.28691044613586  0.8538  0.8055  0.7497  0.7763  0.7828  0.785   0.7782  0.73    0.7504  0.3455  0.0021  0.0493  0.0478  9.591876    121.94432   63.2077 64.7261 9.68262 118.91  9.48605 126.374 9.51632 124.666 9.55169 123.097 9.57373 122.254 9.59818 121.403 9.62448 120.563 9.50012 125.52  9.65311 119.719 9.71611 118.056 9.53956 123.598 9.59347 121.561 9.65895 119.555
1566.5  927.5   -33.213401274416846 -75.28691239293255  0.8768  0.8702  0.7963  0.8287  0.8233  0.8209  0.7982  0.7617  0.7737  0.3599  0.002   0.0469  0.0512  9.591876    121.94432   63.2077 64.7261 9.68262 118.91  9.48605 126.374 9.51632 124.666 9.55169 123.097 9.57373 122.254 9.59818 121.403 9.62448 120.563 9.50012 125.52  9.65311 119.719 9.71611 118.056 9.53956 123.598 9.59347 121.561 9.65895 119.555
1488.5  928.5   -33.378488511902496 -75.28724058707648  0.8861  0.8839  0.8238  0.8425  0.8199  0.8224  0.8003  0.7847  0.7765  0.3624  0.0023  0.0561  0.0597  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1489.5  928.5   -33.37637213942188  -75.28724401326073  0.8813  0.8479  0.7873  0.8153  0.8422  0.8334  0.8146  0.7521  0.79    0.3608  0.0021  0.0572  0.0584  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1490.5  928.5   -33.374255765947325 -75.2872474202336   0.884   0.8697  0.8102  0.845   0.8455  0.8415  0.8285  0.7883  0.7974  0.359   0.0023  0.0554  0.0576  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1491.5  928.5   -33.37213939148442  -75.28725080799506  0.8901  0.8802  0.8183  0.856   0.8566  0.8435  0.8285  0.7786  0.804   0.3601  0.0024  0.0553  0.057   NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1492.5  928.5   -33.370023016038736 -75.28725417654512  0.8815  0.8607  0.8006  0.8368  0.8314  0.8275  0.8135  0.771   0.7865  0.3536  0.0023  0.0541  0.055   NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1493.5  928.5   -33.367906639615875 -75.28725752588373  0.8751  0.8435  0.7843  0.8148  0.8174  0.8144  0.8019  0.7449  0.7686  0.3536  0.0023  0.052   0.0538  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1494.5  928.5   -33.36579026222143  -75.28726085601092  0.8719  0.8724  0.8177  0.8545  0.8387  0.8299  0.8211  0.7898  0.793   0.3545  0.0023  0.055   0.0586  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1495.5  928.5   -33.363673883860976 -75.28726416692662  0.8701  0.8694  0.8039  0.8428  0.8347  0.835   0.8166  0.7782  0.7856  0.3534  0.002   0.0543  0.0546  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1496.5  928.5   -33.36155750454011  -75.28726745863086  0.8688  0.8537  0.7963  0.8333  0.825   0.829   0.81    0.7709  0.7784  0.3479  0.0019  0.0525  0.0546  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1497.5  928.5   -33.35944112426442  -75.28727073112363  0.8548  0.8283  0.7676  0.8069  0.8027  0.7961  0.7849  0.738   0.7596  0.3399  0.002   0.0513  0.0511  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1498.5  928.5   -33.35732474303949  -75.28727398440489  0.8691  0.828   0.7659  0.8038  0.8106  0.7977  0.7894  0.7406  0.7664  0.3452  0.0022  0.0506  0.0502  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1499.5  928.5   -33.35520836087091  -75.28727721847463  0.8878  0.8503  0.7941  0.8226  0.8437  0.8301  0.8254  0.7611  0.791   0.3579  0.0021  0.0533  0.0563  NaN NaN 63.2476 64.9044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1500.5  928.5   -33.35309197776428  -75.28728043333282  0.8974  0.8695  0.8044  0.8397  0.8516  0.8445  0.8307  0.7854  0.8033  0.3628  0.0023  0.0575  0.0592  9.591876    121.94432   63.2077 64.7261 9.68262 118.91  9.48605 126.374 9.51632 124.666 9.55169 123.097 9.57373 122.254 9.59818 121.403 9.62448 120.563 9.50012 125.52  9.65311 119.719 9.71611 118.056 9.53956 123.598 9.59347 121.561 9.65895 119.555
1501.5  928.5   -33.350975593725174 -75.28728362897951  0.8998  0.877   0.8148  0.8441  0.8492  0.84    0.8154  0.7692  0.7918  0.3604  0.0021  0.0515  0.0525  9.591876    121.94432   63.2077 64.7261 9.68262 118.91  9.48605 126.374 9.51632 124.666 9.55169 123.097 9.57373 122.254 9.59818 121.403 9.62448 120.563 9.50012 125.52  9.65311 119.719 9.71611 118.056 9.53956 123.598 9.59347 121.561 9.65895 119.555
1502.5  928.5   -33.34885920875918  -75.28728680541461  0.9023  0.8761  0.8141  0.8487  0.8483  0.8415  0.8216  0.7694  0.7926  0.3603  0.002   0.0526  0.0552  9.591876    121.94432   63.2077 64.7261 9.68262 118.91  9.48605 126.374 9.51632 124.666 9.55169 123.097 9.57373 122.254 9.59818 121.403 9.62448 120.563 9.50012 125.52  9.65311 119.719 9.71611 118.056 9.53956 123.598 9.59347 121.561 9.65895 119.555

3 个答案:

答案 0 :(得分:2)

"NaN"是一个字符串,这就是Numpy的意思。如果你想拥有一个真正的nan对象,你应该使用np.nan(numpy将其表示为nan)。此外,np.isnan()不会对类型为object的数组说明:

In [16]: data = np.array([1, 3])

In [17]: np.isnan(data)
Out[17]: array([False, False], dtype=bool)

In [18]: data = np.array([1, 3, 'NaN'])

In [19]: np.isnan(data)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-0b9ec100cedb> in <module>()
----> 1 np.isnan(data)

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

In [20]: data = np.array([1, 3, np.nan])

In [21]: np.isnan(data)
Out[21]: array([False, False,  True], dtype=bool)

答案 1 :(得分:1)

试试这个:

data = np.where(data == `NaN`, np.nan, data.astype(float))

甚至

data = data.astype(float)

然后你可以使用你的其他功能。

测试:

a=np.array([['1.2','NaN'],['NaN','4.5']], dtype='object')

a
Out[347]: 
array([['1.2', 'NaN'],
       ['NaN', '4.5']], dtype=object)

a.astype(float)

Out[348]: 
array([[ 1.2,  nan],
       [ nan,  4.5]])

尝试复制错误:

a=np.array([['1.2','NaN'],['NaN','4.5','NaN']], dtype='object')

a
Out[350]: array([['1.2', 'NaN'], ['NaN', '4.5', 'NaN']], dtype=object)

a.astype(float)
Traceback (most recent call last):

  a.astype(float)

ValueError: setting an array element with a sequence.

答案 2 :(得分:0)

您有一系列字符串列表。尝试施放以漂浮。

for i,row in enumerate(data):
    for j,x in enumerate(row):
        data[i][j]=float(x)