Когда я работал над некоторыми операциями над множествами в 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.