前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >pandas数据读取的问题记录

pandas数据读取的问题记录

作者头像
sladesal
发布于 2018-11-09 07:01:08
发布于 2018-11-09 07:01:08
1.3K00
代码可运行
举报
文章被收录于专栏:机器学习之旅机器学习之旅
运行总次数:0
代码可运行

最近发现pandas的一个问题,记录一下: 有一组数据(test.txt)如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
20181016    14830680298903273
20181016    14839603473953069
20181016    14839603473953079
20181016    14839603473953089
20181016    14839603473953099
20181016    14839603473953019

剖析出来看,数据是按照\t进行分隔的:'20181016\t14830680298903273\n'

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open('test.txt','r') as f:
    line = f.readline()
    print(line)

我平时一直在用pandas去读数据,所以我很熟练的写下来如下的代码: pd.read_table('test.txt',header=None) 然后发现,第一列变成了科学记数法的方式进行存储了:

很明显,科学记数法是可以转换的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def as_number(value):
    try:
        return '{:.0f}'.format(value)
    except:
        return value

# 应用到目标列去即可
data.uid.apply(as_number)

诡异的事情发生了,对于14830680298903273在as_number函数转换下变成了14830680298903272,理论上讲14830680298903273没有小数部分不存在四舍五入的原因,网上搜了也没有很明确的解释,初步讨论后猜测应该是pandas在用float64去存这种长度过长的数字的时候有精度丢失的问题。

要解决也是很简单的:

  • 用open的形式打开,在切割逐步去用list进行append,在合并
  • 用read_table的函数的时候,默认是用float64去存在的,改成object去存(dtype=object)
  • 在生产数据的时候,对于这种过长的数据采取str的形式去存

也是给自己提个醒,要规范一下自己的数据存储操作,并养成数据核对的习惯。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.10.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验