60

我在 pandas 中有一个 DataFrame,其中一些数字以科学记数法(或指数记数法)表示,如下所示:

                  id        value
id              1.00    -4.22e-01
value          -0.42     1.00e+00
percent        -0.72     1.00e-01
played          0.03    -4.35e-02
money          -0.22     3.37e-01
other            NaN          NaN
sy             -0.03     2.19e-04
sz             -0.33     3.83e-01

科学记数法使应该很容易的比较变得不必要地困难。我认为是 21900 的值把它搞砸了。我的意思是 1.0 是编码的。一!

这不起作用:

np.set_printoptions(supress=True) 

并且pandas.set_printoptions也没有实现抑制,我pd.describe_options()绝望地看着一切,pd.core.format.set_eng_float_format()似乎只为所有其他浮点值打开它,而无法关闭它。

4

6 回答 6

87

快速临时:df.round(4)

全球的:pd.options.display.float_format = '{:20,.2f}'.format

于 2016-12-07T16:52:02.413 回答
13

您的数据可能是objectdtype。这是您的数据的直接复制/粘贴。read_csv将其解释为正确的 dtype。您通常应该只object在类似字符串的字段上使用 dtype。

In [5]: df = read_csv(StringIO(data),sep='\s+')

In [6]: df
Out[6]: 
           id     value
id       1.00 -0.422000
value   -0.42  1.000000
percent -0.72  0.100000
played   0.03 -0.043500
money   -0.22  0.337000
other     NaN       NaN
sy      -0.03  0.000219
sz      -0.33  0.383000

检查您的 dtypes 是否是object

In [7]: df.dtypes
Out[7]: 
id       float64
value    float64
dtype: object

这会将这个帧转换为objectdtype(注意现在的打印很有趣)

In [8]: df.astype(object)
Out[8]: 
           id     value
id          1    -0.422
value   -0.42         1
percent -0.72       0.1
played   0.03   -0.0435
money   -0.22     0.337
other     NaN       NaN
sy      -0.03  0.000219
sz      -0.33     0.383

这是如何将其转换回来 ( astype(float)) 也适用于此处

In [9]: df.astype(object).convert_objects()
Out[9]: 
           id     value
id       1.00 -0.422000
value   -0.42  1.000000
percent -0.72  0.100000
played   0.03 -0.043500
money   -0.22  0.337000
other     NaN       NaN
sy      -0.03  0.000219
sz      -0.33  0.383000

这就是objectdtype 框架的样子

In [10]: df.astype(object).dtypes
Out[10]: 
id       object
value    object
dtype: object
于 2013-07-20T21:11:11.710 回答
3

试试这个,它只会为您提供大值和非常小的值的科学记数法(并添加千位分隔符,除非您省略“,”):

pd.set_option('display.float_format', lambda x: '%,g' % x)

或者要在不损失精度的情况下几乎完全抑制科学记数法,试试这个:

pd.set_option('display.float_format', str)
于 2020-11-19T22:07:04.373 回答
2

如果您想将值用作列表中的格式化字符串,例如作为 csvfile csv.writier 的一部分,则可以在创建列表之前对数字进行格式化:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
于 2017-12-04T17:29:57.407 回答
1

无需四舍五入的快速修复:

pd.options.display.float_format = '{:.0f}'.format
于 2021-03-31T23:55:30.003 回答
0

我尝试了所有选项,例如

  1. pd.options.display.float_format = '{:.4f}'.format
  2. pd.set_option('display.float_format', str)
  3. pd.set_option('display.float_format', lambda x: f'%.{len(str(x%1))-2}f' % x)
  4. pd.set_option('display.float_format', lambda x: '%.3f' % x)

但没有什么对我有用。

所以在将变量/值(var1)分配给变量(比如num1)时,我使用了round(val,5)。

num1 = round(var1,5)

这是一种粗略的方法,因为您必须在每个作业中使用此轮函数。但这可以确保您控制它的发生方式并获得您想要的。

于 2022-02-07T10:25:50.883 回答