Как отсортировать массив numpy, содержащий строковые типы и np.nan - PullRequest
0 голосов
/ 25 декабря 2018

Я просматриваю демонстрацию pandas и пытаюсь отсортировать массив пустых почтовых индексов в виде строк, но в массиве есть значение nan, которое выдает мне сообщение об ошибке, когда я пытаюсь выполнить np.ndarray.sort ().

Это демонстрация, которой я следую (в [48]): http://nbviewer.jupyter.org/github/jvns/pandas-cookbook/blob/v0.2/cookbook/Chapter%207%20-%20Cleaning%20up%20messy%20data.ipynb

Вот примерные значения (они усекаются из фактического демонстрационного примера)

>>>print(unique_zips)
['11432' '11378' '10032' '10023' '10027' '11372' '11419' '11417' '10011'
 nan '10033' '11216' '10016' '10305' '10312' '10026' '10309' '10036']

Вот ошибка

>>>print(unique_zips.sort())
TypeError: unorderable types: float() < str()

Обходной путь

Я обнаружил, что могу обойти эту проблему, предварительно отсортировав список следующим образом:

unique_zips = requests['Incident Zip'].sort_values().unique()
print(unique_zips)

out:
['00083', ... '92123', nan]

Но если я сделаю это, я получу ошибку

unique_zips = requests['Incident Zip'].unique()
print(unique_zips.sort())

out:
TypeError: unorderable types: float() < str()

Я проверил тип nan, и это 'float', который объясняет ошибку float ()

Мое решение - нормальное решение, но я хотел бы понять, почему nan в моем массиве numpy не позволяет мне сортировать массив.Мне не нравится, как я должен сортировать значения, прежде чем я вызову unique ().Это может быть медленнее, а также не идеально, так как я хочу, чтобы мои результаты соответствовали демонстрации, за которой я следую.

Есть ли флаг, который можно установить при сортировке массива numpy для обработки nan?

1 Ответ

0 голосов
/ 25 декабря 2018

Это должно отсортировать ваш исходный массив на основе числовых значений и игнорировать numpy.nan.

import numpy as np

arr = np.array(['11432', '11378', '10032', '10023', '10027', '11372', '11419', 
                '11417', '10011', np.nan, '10033', '11216', '10016', '10305', 
                '10312', '10026', '10309', '10036'])

arr = np.sort(arr[~np.isnan(arr.astype(float))])

Это должно прекрасно работать и со столбцами Pandas (Series).

Тильда (~) отменяет условие и фильтрует, где это условие "не верно".Но в первую очередь вы не должны иметь массивы смешанного типа;почему у вас есть в основном строки и NaN?Ни одна из векторизованных возможностей NumPy не будет работать с таким массивом.Этот конкретный фильтр работает, потому что каждая из ваших строк может быть приведена к типу float в качестве общего знаменателя для ваших смешанных данных;результат по-прежнему имеет тип string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...