pandas数据读取的问题记录

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

20181016    14830680298903273
20181016    14839603473953069
20181016    14839603473953079
20181016    14839603473953089
20181016    14839603473953099
20181016    14839603473953019

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

with open('test.txt','r') as f:
    line = f.readline()
    print(line)

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

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

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的形式去存

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

欢迎大家关注我的个人bolg知乎,更多代码内容欢迎follow我的个人Github,如果有任何算法、代码、转行疑问都欢迎通过公众号发消息给我。

推荐阅读更多精彩内容

  • 忽然意识到别人不要我不是因为现在的工作不好 行业或许也没那么重要 重要的是能力 是我没有总结我从中学到了什么 我的...
    角落蜷缩阅读 22评论 0 0
  • 2018年3月8日 星期四 雨转阴 今天一大早起来,从窗户往下看,地面还是湿哒哒的。转身,先生和孩子还在躺在梦...
    徐夭夭阅读 46评论 0 5
  • 慕课网: HTML+CSS基础课程 CSS全称为“层叠样式表 (Cascading Style Sheets)”,...
    CAICL阅读 69评论 0 1
  • 【日精进打卡650天】 姓名:玉生 沈阳盛和商学院 六项精进第177期学员(队长),271期284期288期295...
    _玉_生_阅读 36评论 0 1