2017-02-22 22 views
1

Я хочу удалить nan из массива numpy. Допустим, мой NumPy массив содержит:удалите 'nan' или уменьшите длину массива numpy, если массив содержит nan после преобразования в numpy из pandas

np_array = ["123","pqr","123",nan,"avb", nan] 

Ожидаемый результат:

["123","pqr","123","avb"] 

Если мы делаем это в панд с помощью pandas.dropna() удаляет всю строку, которую я не хочу делать. Я просто хочу удалить значение и уменьшить размер массива.

Есть ли какой-либо возможный способ?

+1

Эти предлагаемые дубликаты работают только для числовых массивов (так что это не дубликаты)! – MSeifert

+0

Я предполагаю, что вы также не хотите удалять строки? – AsheKetchum

+0

Вы посмотрели на pandas.fillna()? В общем случае, если строка считается наблюдением, мы попытаемся сохранить всю строку, а не только стереть значения nan внутри строки. – AsheKetchum

ответ

0

isnan() должен сделать трюк. Работа минимального примера о том, как это сделать:

>>> import numpy as np 
>>> np_array = np.array([1,2,3,np.nan,4]) 
>>> np_array 
array([ 1., 2., 3., nan, 4.]) 
>>> np_array = np_array[~np.isnan(np_array)] 
>>> np_array 
array([ 1., 2., 3., 4.]) 
+0

не работает: Ошибка: *** TypeError: ufunc 'isnan' не поддерживается для типов ввода, а входы c ting rule '' safe '' его dtype - объект –

+0

Проверьте 'dtype' вашего массива , 'isnan' вызывает эту ошибку для массивов объектов. Если нет причин иметь массив объектов, вы можете сделать 'arr.dtype = np.float64' или что хотите, а затем' isnan' будет работать. Если вам нужны объекты, используйте ответ MSeifert выше. –

0

Попробуйте

np_clean = [x for x in np_array if str(x) != 'nan'] 

Это удалит нана из списка

1

Вы не можете использовать np.isnan потому что NaN s являются строками в вашем массив, но вы можете использовать булево индексирование по сравнению со строкой: "nan":

>>> import numpy as np 
>>> np_array = np.array(["123","pqr","123",np.nan,"avb", np.nan]) 
>>> np_array[np_array != 'nan'] 
array(['1234', 'pqr', '123', 'avb'], 
     dtype='<U4') 
0

Это работает для числовых массивов.

filter(lambda x: np.isfinite(x), np.array([1,2,3,np.nan])) 

>>>[1.0, 2.0, 3.0]