NumPy или панды: сохранение типа массива как целое число, имея значение NaN
есть ли предпочтительный способ сохранить тип данных numpy
массив крепится как int
(или int64
или что-то еще), в то время как элемент внутри указан как numpy.NaN
?
в частности, я преобразовываю внутреннюю структуру данных в фрейм данных Pandas. В нашей структуре у нас есть целочисленные столбцы, которые все еще имеют NaN (но dtype столбца-int). Кажется, чтобы переделать все как поплавок, если мы сделаем это фрейм данных, но мы действительно хотели бы быть int
.
мысли?
чего пробовал:
Я пробовал использовать
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