Есть ли предпочтительный способ сохранить тип данных numpy
массива фиксированным как int
( int64
или что-то еще), в то же время сохраняя элемент внутри как numpy.NaN
?
В частности, я конвертирую внутреннюю структуру данных в Pandas DataFrame. В нашей структуре у нас есть столбцы целочисленного типа, которые все еще имеют NaN (но d-тип столбца - int). Похоже, что все переделано как float, если мы сделаем это DataFrame, но нам бы очень хотелось int
.
Мысли?
Вещи пытались:
Я попытался использовать from_records()
функцию под pandas.DataFrame, с coerce_float=False
и это не помогло. Я также пытался использовать маскированные массивы NumPy с NaN fill_value, что также не работало. Все это привело к тому, что тип данных столбца стал плавающим.
from_records
функцию в pandas.DataFrame,coerce_float=False
но не повезло ... она все еще заставляет новые данные иметь типfloat64
.Ответы:
Эта возможность была добавлена в pandas (начиная с версии 0.24): https://pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support
На этом этапе требуется использование расширения dtype Int64 (с большой буквы), а не по умолчанию dtype int64 (строчные буквы).
источник
'Int64'
чтобы он работал. Будет еще лучше, когда он будет включен по умолчанию.'Int64'
или есть что-то подобное'Int8'
? Он использует безумное количество памяти по сравнению сnp.float
.'Int8'
кажется, работает, ноnp.float
все еще, кажется, загружается намного быстрее. Кажется, проблема в том, что между ними не высвобождается память. Предположим, что сборщик мусора в конечном итоге запустится.NaN
не может быть сохранен в целочисленном массиве. Это известное ограничение панд на данный момент; Я ждал прогресса в достижении значений NA в NumPy (аналогично NA в R), но пройдет не менее 6 месяцев в году, пока NumPy получит эти функции, кажется:http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
(Эта функция была добавлена начиная с версии 0.24 для панд, но учтите, что для нее требуется расширение dtype Int64 (с заглавной буквы), а не d64 int64 (строчная буква) по умолчанию: https://pandas.pydata.org/pandas- docs / version / 0.24 / whatsnew / v0.24.0.html # option-integer-na-support )
источник
Если производительность не является основной проблемой, вы можете хранить строки вместо этого.
Тогда вы можете смешивать
NaN
столько, сколько хотите. Если вы действительно хотите иметь целые числа, в зависимости от вашего приложения, вы можете использовать-1
, или0
, или1234567890
, или какое-то другое выделенное значение для представленияNaN
.Вы также можете временно дублировать столбцы: один, как у вас, с плавающей точкой; другой экспериментальный, со вставками или строками. Затем вставляет
asserts
в каждое разумное место, проверяя, что оба синхронизированы. После достаточного тестирования вы можете отпустить поплавки.источник
Это решение не для всех случаев, но мое (геномные координаты) я использовал 0 в качестве NaN
Это, по крайней мере, позволяет использовать надлежащий «родной» тип столбца, такие операции, как вычитание, сравнение и т. Д., Работают как положено
источник
Панды v0.24 +
Функциональность для поддержки
NaN
целочисленных рядов будет доступна в v0.24 и выше. Там же информация об этом в v0.24 «Что нового» раздел, и больше деталей под Nullable Integer Тип данных .Панды v0.23 и ранее
Вообще, лучше работать с
float
сериями, где это возможно, даже если серия отклоняется отint
доfloat
из-за включенияNaN
значений. Это позволяет векторизовать вычисления на основе NumPy, где в противном случае будут обрабатываться циклы уровня Python.Документы действительно предлагают : «Одна возможность - использовать
dtype=object
массивы». Например:По косметическим причинам, например, вывод в файл, это может быть предпочтительным.
Панды v0.23 и более ранние: фон
NaN
считаетсяfloat
. В документах в настоящее время (по состоянию на v0.23) указать причину , почему Integer серии upcasted кfloat
:Документы также предоставляют правила для апскейтинга из-за
NaN
включения:источник
Теперь это возможно, поскольку pandas v 0.24.0
Замечания к выпуску pandas 0.24.x Цитата: «У Pandas появилась возможность хранить целочисленные dtypes с отсутствующими значениями.
источник
Просто хочу добавить, что в случае, если вы пытаетесь преобразовать вектор с плавающей точкой (1.143) в целое число (1) с преобразованием NA в новый тип Int64, вы получите ошибку. Чтобы решить эту проблему, вы должны округлить числа и затем выполнить «.astype ('Int64')»
Мой вариант использования состоит в том, что у меня есть серия чисел с плавающей точкой, которую я хочу округлить до int, но когда вы делаете .round (), в конце числа остается «* .0», так что вы можете сбросить этот 0 с конца на преобразование в int.
источник
Если в текстовых данных есть пробелы, столбцы, которые обычно были бы целыми числами, будут преобразованы в числа с плавающей точкой как float64 dtype, потому что int64 dtype не может обрабатывать нули. Это может привести к несогласованности схемы, если вы загружаете несколько файлов, некоторые с пробелами (которые в конечном итоге получат float64, а другие, без которых получится int64).
Этот код будет пытаться преобразовать столбцы любого числового типа в Int64 (в отличие от int64), так как Int64 может обрабатывать нули
источник