Формат 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

Другие вопросы по тегам