×
广告

pandas数据读取的问题记录

96
slade_sal
2018.10.23 14:07 字数 404

最近发现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,如果有任何算法、代码、转行疑问都欢迎通过公众号发消息给我。

Python开发总结
Web note ad 1