栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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()等,长数字序号会被转换为科学计数,比如:

 

问题2: pandas将dataframe输出为excel时,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! 

 

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

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

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

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

x = [7030834394457754405703083439703083439.0,7030834394457759800703083439703083439.0,7030834394457754409703083439703083439.0]

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

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

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

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

得到的结果会是:

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

问题原因及方案

其实,出现这一问题的原因是,数据序号在原数据中的格式是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

输出是:

 

但是,此时如果直接保存到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')

输出:

 

Excel:

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850280.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号