最近发现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去存这种长度过长的数字的时候有精度丢失的问题。
要解决也是很简单的:
也是给自己提个醒,要规范一下自己的数据存储操作,并养成数据核对的习惯。