NumPy или панды: сохранение типа массива как целое число, имея значение NaN


есть ли предпочтительный способ сохранить тип данных numpy массив крепится как int (или int64 или что-то еще), в то время как элемент внутри указан как numpy.NaN?

в частности, я преобразовываю внутреннюю структуру данных в фрейм данных Pandas. В нашей структуре у нас есть целочисленные столбцы, которые все еще имеют NaN (но dtype столбца-int). Кажется, чтобы переделать все как поплавок, если мы сделаем это фрейм данных, но мы действительно хотели бы быть int.

мысли?

чего пробовал:

Я пробовал использовать

4 92

4 ответа:

NaN не может быть сохранен в целочисленном массиве. Это известное ограничение панд на данный момент; я ждал прогресса, который будет достигнут со значениями NA в NumPy (аналогично NAs в R), но это будет по крайней мере от 6 месяцев до года, прежде чем NumPy получит эти функции, кажется:

http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na

(обратите внимание, что он был добавлен, но как новая функция только в разработке версия (до сих пор): http://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#optional-integer-na-support )

если производительность не является основной проблемой, вы можете хранить строки вместо этого.

df.col = df.col.dropna().apply(lambda x: str(int(x)) )

тогда вы можете смешать то с NaN столько, сколько вы хотите. Если вы действительно хотите иметь целые числа, в зависимости от вашего приложения, вы можете использовать -1 или 0 или 1234567890, или какое-то другое выделенное значение для представления NaN.

вы также можете временно дублировать столбцы: один, как у вас, с поплавками; другой экспериментальный, с ints или строками. Потом вставить asserts в каждом разумном месте, проверяя, что они синхронизированы. После достаточного тестирования вы можете отпустить поплавки.

Это не решение для всех случаев, но мое (геномные координаты) я прибегал к использованию 0 в качестве NaN

a3['MapInfo'] = a3['MapInfo'].fillna(0).astype(int)

Это, по крайней мере, позволяет использовать правильный "родной" тип столбца, операции, такие как вычитание, сравнение и т. д. работают так, как ожидалось

эта возможность была добавлена в последние бета панд: http://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#optional-integer-na-support