pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

使用pandas处理包含产品序号的数据,序号是一串长的数字符号,遇到一系列科学技术法相关的问题。查阅了针对这个问题的一些已有解答,发现不能完全解决问题,也没有解释清楚问题出现的原因,所以举个简单的案例,彻底说明白怎么避免这个问题。

先放最终解决方案:

#显示不采用科学计数法
import numpy as np
np.set_printoptions(suppress=True)
pd.set_option('display.float_format', lambda x: '%.0f' % x)

#转excel不采用科学计数法
df['id'] = df['id'].astype(np.int64).astype(str)
df.to_excel('try.xlsx')

1.问题描述

结合一个小例子来看看可能出现的问题、原因以及为什么上面的方案可以解决。

首先,以这一串id为例:

x = [7030834394457750.0,7030834394457750.0,7030834394457750.0]

处理中可能遇到的问题包括:

问题1: pandas输出的df.head()等,长数字序号会被转换为科学计数,比如:

pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

问题2: pandas将dataframe输出为excel时,excel中的数据也会以科学计数保存

pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

2. 解决方案

问题1: pandas输出的df.head()等,长数字序号会被转换为科学计数

可以通过设置numpy的数据展示格式解决,在输出df前先运行以下代码:

import numpy as np
np.set_printoptions(suppress=True)
pd.set_option('display.float_format', lambda x: '%.0f' % x) #不采用科学计数法,不要小数点

再照常输出df:

bingo!

pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

问题2: pandas将dataframe输出为excel时,excel中的数据也会以科学计数保存

这个问题已有回答实在是挖了很多坑,下面例举几个:

无效方案一:不需要处理,excel中的数据只是被转为了科学计数表达,只要转为数字格式就能复原

  • 如果数字序号非常长的话,科学技术的小数点是保留不到那么多位的,这会导致数据精度丧失,对id这样的序号来说尤其不可取,比如对一串特别长的数字:

x = [7030834394457754405703083439703083439.0,7030834394457759800703083439703083439.0,7030834394457754409703083439703083439.0]

直接保存成科学计数法再转换后:

pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

无效方案二:直接转成string再存储为excel

许多回答表示可以尝试’df[‘id’].astype(str)’再存储,但如果序号确实很长,这也会遇到问题。还是以上面为例,如果尝试以下代码:

df['id'].astype(str)
df.to_excel('try.xlsx')

得到的结果会是:

pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

和前面对比,依然没有解决问题。

问题原因及方案

其实,出现这一问题的原因是,数据序号在原数据中的格式是float。可以注意到上面的小例子输入x的时候特意加了小数点:

import pandas as pd
x = [7030834394457750.0,7030834394457750.0,7030834394457750.0]
df = pd.DataFrame({'id':x})
df

如果不加小数点,默认识别成int的话,还有这个问题吗?

我们不改变数据显示格式,直接运行以下几行:

import pandas as pd
x = [7030834394457750,7030834394457750,7030834394457750]
df = pd.DataFrame({'id':x})
df

输出是:

pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

但是,此时如果直接保存到excel,还是有科学计数的问题:

pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

所以还需要再转换一次,先将长序号转为int,再将int转为string,这样就可以彻底解决问题二了。

综合来说,结合【显示格式的设定】和【保存格式的转换】,通过以下代码,可以彻底解决问题一和问题二:

#显示不采用科学计数法
import numpy as np
np.set_printoptions(suppress=True)
pd.set_option('display.float_format', lambda x: '%.0f' % x)

#转excel不采用科学计数法
df['id'] = df['id'].astype(np.int64).astype(str)
df.to_excel('try.xlsx')

输出:

pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

Excel:

pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

Original: https://blog.csdn.net/liatan/article/details/124532529
Author: Liagogo
Title: pandas将df保存为excel,如何避免长数据序号被保存为科学计数法?解答各种坑

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/675363/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球