Формат Pandas - Как сохранить столбец float64 в DataFrame (с NaN) как int?
Мой DataFrame имеет около 20 столбцов со смешанными типами столбцов; одним из них является идентификационный номер из 15-18 цифр. Некоторые строки не имеют идентификационного номера (в столбце есть NaN). При чтении.csv идентификационный номер записывается с использованием научных обозначений, теряя преимущество идентификационного номера...
Я пытаюсь найти способ сохранить DataFrame как CSV (используя.to_csv), сохраняя этот идентификационный номер в полном виде int.
Самой близкой вещью, которую я нашел, был Формат / Подавить научную нотацию из результатов агрегации панд Python, но она изменяет все столбцы, где я хотел бы изменить только один.
Спасибо за вашу помощь!
2 ответа
Как сказал MaxU в комментариях, лучше всего использовать местозаполнитель для NaN.
Я использовал.fillna(-9999) в своем столбце, чтобы удалить NaN, тогда легко идентифицировать идентификатор как int (используя.astype(int) или dtype).
Задача решена. Спасибо за вашу помощь!
Начиная с панды 0.24 (январь 2019 г.), вы можете представлять свои данные как arrays.IntegerArray
, соответствующие обнуляемым целым числам, позволяя вам достичь того, что вы хотите, придерживаясь идиоматических панд.
Например, предположим, что то, что вы получите с помощью float:
In [99]: df.Id
Out[99]:
0 1.000000e+18
1 2.000000e+18
2 3.000000e+18
3 NaN
4 4.000000e+18
Name: Id, dtype: float64
In [100]: df.Id.to_csv('output.csv')
In [101]: !cat output.csv
0,1e+18
1,2e+18
2,3e+18
3,
4,4e+18
Затем, используя dtype 'Int64'
, вы получите следующее:
In [102]: df.Id.astype('Int64')
Out[102]:
0 1000000000000000000
1 2000000000000000000
2 3000000000000000000
3 NaN
4 4000000000000000000
Name: Id, dtype: Int64
In [103]: df.Id.astype('Int64').to_csv('output.csv')
In [104]: !cat output.csv
0,1000000000000000000
1,2000000000000000000
2,3000000000000000000
3,
4,4000000000000000000
Ты можешь использовать float_format
при вызове to_csv()
df.to_csv(filepath, index=False, sep='\t', float_format='%.6f')
Полный ответ здесь: преобразовать научную нотацию в десятичный panda python
В вашем случае с идентификаторами вы можете попробовать изменить 6 на 0