Pandas读取CSV浮点数出现多余末尾数字,如何解决?
嘿,这个问题其实是浮点数二进制存储的精度bug在搞怪!Pandas和Python标准库csv的处理逻辑不一样,才导致了这个差异:
csv.DictReader默认把读取的内容当成字符串来处理,你打印的其实就是文件里的原始字符串值;但Pandas会自动把数值列解析成float64类型——而这类浮点数在二进制存储时,没法精确表示某些十进制小数(比如你用到的2.989583333),所以就会出现末尾那串多余的数字。
这里给你几个实用的解决办法:
办法一:读取时强制列类型为字符串
直接告诉Pandas把end_beat列当成字符串读,这样就能完全保留原始的数值格式:import pandas as pd df = pd.read_csv('debug.csv', dtype={'end_beat': str}) print(df['end_beat'][1]) # 输出 1.989583333如果之后需要做数值计算,再按需转换成高精度的数值类型就好。
办法二:用Decimal类型存储,彻底避免精度损失
如果你需要精准的数值计算,不想依赖float的话,可以在读取时把列转换成Decimal类型:import pandas as pd from decimal import Decimal df = pd.read_csv('debug.csv', converters={'end_beat': Decimal}) print(df['end_beat'][1]) # 输出 1.989583333Decimal类型能完美精确表示十进制小数,适合对精度要求高的场景。
办法三:格式化输出,临时隐藏多余位数
要是只是输出的时候不想看到那串尾巴,直接格式化打印就行:import pandas as pd df = pd.read_csv('debug.csv') # 保留9位小数,和原始数值的位数一致 print("{0:.9f}".format(df['end_beat'][1]))或者也可以用Pandas的
round方法统一处理整列数据:df['end_beat'] = df['end_beat'].round(9) print(df['end_beat'][1])
内容的提问来源于stack exchange,提问作者Raven Cheuk
相关产品推荐
相关产品推荐

