Python Pandas 科学计数法不一致

1 投票
1 回答
1661 浏览
提问于 2025-04-28 12:53

我最近在用Pandas重写一些数据分析的代码(因为我刚发现这个工具),在Ubuntu 14.04 64位系统上遇到了一些奇怪的情况。我的数据文件看起来是这样的:

26/09/2014  00:00:00    2.423009    -58.864655  3.312355E-7 6.257226E-8 302 305
26/09/2014  00:00:00    2.395637    -62.73302   3.321525E-7 7.065322E-8 302 305
26/09/2014  00:00:01    2.332541    -57.763269  3.285718E-7 6.873837E-8 302 305
26/09/2014  00:00:02    2.366828    -51.900812  3.262279E-7 7.397762E-8 302 305
26/09/2014  00:00:03    2.435500    -40.820161  3.241068E-7 6.777224E-8 302 305
26/09/2014  00:00:04    2.428922    -65.573049  3.212358E-7 6.761804E-8 302 305
26/09/2014  00:00:05    2.419931    -59.414711  3.185517E-7 7.243236E-8 302 305
26/09/2014  00:00:06    2.416663    -60.064279  3.209795E-7 6.242328E-8 302 305
26/09/2014  00:00:07    2.411954    -52.586242  3.184297E-7 5.825581E-8 302 304
26/09/2014  00:00:08    2.457342    -61.874388  3.151493E-7 6.327384E-8 303 304

这些列是用制表符分开的。为了把这些数据读入Pandas,我使用了以下简单的命令:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv("path/to/file.dat", sep="\t", header=None)
print data

这段代码的输出结果是:

            0         1         2          3  4             5    6    7
0  26/09/2014  00:00:00  2.423009 -58.864655  0  6.257226e-08  302  305
1  26/09/2014  00:00:00  2.395637 -62.733020  0  7.065322e-08  302  305
2  26/09/2014  00:00:01  2.332541 -57.763269  0  6.873837e-08  302  305
3  26/09/2014  00:00:02  2.366828 -51.900812  0  7.397762e-08  302  305
4  26/09/2014  00:00:03  2.435500 -40.820161  0  6.777224e-08  302  305
5  26/09/2014  00:00:04  2.428922 -65.573049  0  6.761804e-08  302  305
6  26/09/2014  00:00:05  2.419931 -59.414711  0  7.243236e-08  302  305
7  26/09/2014  00:00:06  2.416663 -60.064279  0  6.242328e-08  302  305
8  26/09/2014  00:00:07  2.411954 -52.586242  0  5.825581e-08  302  304
9  26/09/2014  00:00:08  2.457342 -61.874388  0  6.327384e-08  303  304

[10 rows x 8 columns]

这里需要注意的是第4列。把它和第5列以及原始数据对比一下。第5列用科学计数法显示,而第4列则没有。它并没有把这一列的值变成零或者转换成整数,因为:

>>> data[4][0]*1e7
3.3123550000000002

这正是我所期待的结果。所以数据的值是一样的,但显示的方式变了。如果这只是个外观上的问题,我可以接受,但这让我有点不安,我想知道这是怎么回事。

暂无标签

1 个回答

4

是的,这只是个外观上的问题,你可以通过使用 set_option 来改变它:

In [21]:

pd.set_option('display.precision',20)
df[4]
Out[21]:
0    0.0000003312355
1    0.0000003321525
2    0.0000003285718
3    0.0000003262279
4    0.0000003241068
5    0.0000003212358
6    0.0000003185517
7    0.0000003209795
8    0.0000003184297
9    0.0000003151493
Name: 4, dtype: float64

底层的数据不会被截断,所有的数据都会被保留,包括当你把数据写回到csv文件时。

如果你在使用iPython,你可以查看默认的设置,比如显示精度(有效数字),通常是7位。

撰写回答