AttributeError: объект 'numpy.ndarray' не имеет атрибута 'fillna' [duplicate]

Sqlectron - это межплатформенный SQL-клиент с открытым исходным кодом с простым и простым графическим интерфейсом, который поддерживает Microsoft SQL Server (наряду с PostgreSQL, MySQL, Cassandra и SQLite).

43
задан 17 June 2016 в 18:08

8 ответов

Вы можете использовать np.where, чтобы найти, где у вас есть NaN:

import numpy as np

a = np.array([[   0,   43,   67,    0,   38],
              [ 100,   86,   96,  100,   94],
              [  76,   79,   83,   89,   56],
              [  88,   np.nan,   67,   89,   81],
              [  94,   79,   67,   89,   69],
              [  88,   79,   58,   72,   63],
              [  76,   79,   71,   67,   56],
              [  71,   71,   np.nan,   56,  100]])

b = np.where(np.isnan(a), 0, a)

In [20]: b
Out[20]: 
array([[   0.,   43.,   67.,    0.,   38.],
       [ 100.,   86.,   96.,  100.,   94.],
       [  76.,   79.,   83.,   89.,   56.],
       [  88.,    0.,   67.,   89.,   81.],
       [  94.,   79.,   67.,   89.,   69.],
       [  88.,   79.,   58.,   72.,   63.],
       [  76.,   79.,   71.,   67.,   56.],
       [  71.,   71.,    0.,   56.,  100.]])
2
ответ дан 15 August 2018 в 16:01
  • 1
    как это, он не работает, вам нужно изменить np.where(np.isnan(a), a, 0) на np.where(~np.isnan(a), a, 0). Это может быть разница в используемых версиях. – TehTris 2 March 2018 в 03:21
  • 2
    @TehTris, ты прав, спасибо. Я изменил его на b = np.where(np.isnan(a), 0, a), что более прямолинейно, с ~, как я думаю. – Anton Protopopov 2 March 2018 в 09:22

Вы можете использовать numpy.nan_to_num:

numpy.nan_to_num (x): Заменить nan с нулем и inf с конечными числами.

Пример (см. doc):

>>> np.set_printoptions(precision=8)
>>> x = np.array([np.inf, -np.inf, np.nan, -128, 128])
>>> np.nan_to_num(x)
array([  1.79769313e+308,  -1.79769313e+308,   0.00000000e+000,
        -1.28000000e+002,   1.28000000e+002])
0
ответ дан 15 August 2018 в 16:01

Пример кода для ответа drake на использование nan_to_num:

>>> import numpy as np
>>> A = np.array([[1, 2, 3], [0, 3, np.NaN]])
>>> A = np.nan_to_num(A)
>>> A
array([[ 1.,  2.,  3.],
       [ 0.,  3.,  0.]])
6
ответ дан 15 August 2018 в 16:01

Как насчет nan_to_num ()?

24
ответ дан 15 August 2018 в 16:01
  • 1
    nan_to_num () также изменяет бесконечности - в некоторых случаях это может быть нежелательным. – Agos 10 May 2011 в 13:43
  • 2
    Его также & gt; 10x медленнее, чем другие методы. – user48956 13 January 2018 в 00:05
  • 3
    Я не был уверен в tat & quot; & gt; 10x slow & quot; поэтому я проверил. Действительно, это намного медленнее. Спасибо за указание на это. – Gabriel 7 May 2018 в 18:05

nan никогда не равен nan

if z!=z:z=0

, поэтому для 2D-массива

for entry in nparr:
    if entry!=entry:entry=0
2
ответ дан 15 August 2018 в 16:01
  • 1
    Это не работает: entry - это 1D-массив, поэтому тест entry != entry не дает простого булева, но повышает ValueError. – Eric Lebigot 5 August 2017 в 22:20

Вы можете использовать лямбда-функцию, пример для массива 1D:

import numpy as np
a = [np.nan, 2, 3]
map(lambda v:0 if np.isnan(v) == True else v, a)

Это даст вам результат:

[0, 2, 3]
0
ответ дан 15 August 2018 в 16:01

Где A - ваш 2D-массив:

import numpy as np
A[np.isnan(A)] = 0

Функция isnan создает массив bool, указывающий, где находятся значения NaN. Логический массив может использоваться для индексации массива той же формы. Подумайте об этом как маску.

70
ответ дан 15 August 2018 в 16:01

Для ваших целей, если все элементы хранятся как str, и вы просто используете отсортированные по мере использования, а затем проверяете первый элемент и заменяете его «0»

>>> l1 = ['88','NaN','67','89','81']
>>> n = sorted(l1,reverse=True)
['NaN', '89', '88', '81', '67']
>>> import math
>>> if math.isnan(float(n[0])):
...     n[0] = '0'
... 
>>> n
['0', '89', '88', '81', '67']
-7
ответ дан 15 August 2018 в 16:01
  • 1
    Разве ваш комментарий немного суровый? Я знаю, что такое numpy, но знал, что массив не будет строковым представлением чисел. Я специально не делал этого с точки зрения сперва, но с точки зрения python, если бы это было полезно. – Senthil Kumaran 26 February 2011 в 07:24
  • 2
    Переупорядочение массива просто звучит как путаный способ решения этого. – holografix 21 June 2014 в 21:25

Другие вопросы по тегам:

Похожие вопросы: