Непоследовательное поведение nans в Python numpy / pandas - PullRequest
2 голосов
/ 24 мая 2019

Когда я работал над некоторыми операциями над множествами в Python, используя numpy и pandas, я столкнулся со странным явлением, которое, я бы сказал, приводит к несогласованности в обработке nan s.

Давайте предположим, что у нас очень простая ситуация с наборами в качестве наших достопримечательностей:

import numpy as np
import pandas as pd

a = {1, 2, 3, np.nan}
b = {1, 2, 4, np.nan}

print(a - b)

Out:

{3}

Это прекрасно, и мы ожидаем, что это будетИтак, но давайте продолжим с несколько более сложным примером, в который входит pandas ряд / фрейм данных:

series = pd.Series([1, 2, 3, np.nan, 1, 2, 3])
d = set(series)
print(d)

Out:

{nan, 1.0, 2.0, 3.0}

Еще раз, совершенно отлично.Однако, когда мы вызываем:

print(d - b)  # the same applies to a single column of a data frame in place of a series

, результат (совершенно неожиданно для меня):

{nan, 3.0}

В выводе все еще есть значение nan.

Я понимаю, что когда мы создаем переменную series, все входные значения преобразуются изнутри в формат float64, включая значение nan.

type(series.iloc[3])

Out:

numpy.float64

В то время как тип свободно созданного np.nan просто float.Конечно, функция np.isnan() в обоих случаях возвращает True.Я все еще рассматриваю это как несоответствие, потому что я предположил бы, что все основные операции Python (к которым несомненно принадлежат операции set) будут обрабатывать nan s аналогично числам.Даже если к числам в наборах было применено то же преобразование типов, что и в случае nan с (в чистом Python они равны int с, тогда как в сериях pandas они равны float с), операции над множествами по-прежнему сохраняются.рассматривайте их как одни и те же объекты и адекватно удаляйте значения.nan предполагается также (квази) числовым, но обрабатывается по-другому.Это особенность, ошибка или подтвержденная ситуация, которая по какой-то причине не может быть решена?

Версия Python: 3.6.6.Numpy версия: 1.16.2.Версия для панд: 0.24.2.

...