Python Pandas 科学记数法不一致

Posted

技术标签:

【中文标题】Python Pandas 科学记数法不一致【英文标题】:Python Pandas Scientific Notation Iconsistent 【发布时间】:2014-10-20 11:15:18 【问题描述】:

我正在考虑在 Ubuntu 14.04 64 位上使用 Pandas(因为我刚刚发现它)重写一些数据分析代码,但我遇到了一些奇怪的行为。我的数据文件如下所示:

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 列则没有。它不仅将列清零或将其转换为 int,因为:

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

这是我所期望的。所以数据值是相同的,但表示已经改变。如果这只是一个装饰性的东西,那我可以忍受,但它让我感到不安,我想知道这里发生了什么。

【问题讨论】:

【参考方案1】:

是的,这是一种装饰性的东西,您可以使用 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。

【讨论】:

好的,谢谢您的保证。我只是觉得奇怪的是,第 5 列(甚至包含 更小的 值)显示正确,而第 4 列却没有。我使用了 set_option 命令,它显示了我期望的数字,但现在它们不是科学计数法。如果我四处搜索,大概会找到一个设置。 这实际上解决了我遇到的一个问题,即 pandas 读取指数数字并切断有效数字

以上是关于Python Pandas 科学记数法不一致的主要内容,如果未能解决你的问题,请参考以下文章

以科学记数法将带有科学记数法的文本文件读取到 pandas 数据框

问题解决:Python中取消科学计数法,常见于Numpy|Pandas

Python使用pandas设置数据列中float数据类型的有效小数位数抑制科学计数法

如何在 Pandas Dataframe Python 中使用科学计数法显示小数字?

Python机器学习入门——科学计算库(Pandas)

Python科学计算之Pandas