如何在 pandas 中取消科学计数法?

71

我有一个使用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也没有实现suppress,我已经绝望地查看了pd.describe_options()pd.core.format.set_eng_float_format()似乎只能在所有其他浮点值上打开它,无法关闭。


2
你有没有修复 np.set_printoptions(suppress=True) 中的错别字 - suppress 单词中有两个 p 吗? - smci
我认为这个问题应该重新开放,因为它有最好的答案,并且在被关闭为重复问题之前就已经提问了。 - Josiah Yoder
1
@JosiahYoder,关闭并不意味着删除。它只是停止更多的回答。 - Rohit Gupta
6个回答

103
快速临时: df.round(4) 全局: pd.options.display.float_format = '{:20,.2f}'.format :20 表示总宽度应为二十个字符,如果长度不足,则在左侧填充空格。如果您不想指定数字,可以简单地使用 '{:,.2f}'.2f 表示小数点后应有两位数字,即使它们是零。

7
“{:20}” 是什么意思? - Moondra
3
尝试这个实验:print('{:20,.8f}'.format(12333344445676.0123456789)),然后将20调整为40,看看会发生什么,我想你就会得到答案。你可以在打印语句中使用相同的样式格式化数值。 - TMWP
2
同意@Bouncner的观点,我也尝试了许多解决方案,但只有这个解决方案可以按预期在pandas中打印浮点值的特定小数位数。 - Good Will
3
@Moondra {:20} 指定了输出的总宽度,包括小数部分。这不是必须的。因此,可以使用{:,.2f}来指定逗号和两个小数点必须打印出来。 - Siraj Samsudeen
1
太好了!对于科学计数法,请使用'{:e}'.format - Eduardo Reis
显示剩余2条评论

15

你的数据可能是object类型。这是你的数据的直接复制/粘贴。read_csv将其解释为正确的数据类型。在字符串字段上,通常只应该有object类型。

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

检查你的数据类型是否为 object

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

这将把这个框架转换成object类型(请注意,打印结果现在有点奇怪)

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

这是一个object数据类型的框架的样子

In [10]: df.astype(object).dtypes
Out[10]: 
id       object
value    object
dtype: object

实际上,该列是int64类型,然后进行了df.corr()操作,返回所有的float64类型。 - user1244215
1
如果在列中有NaN,则它不可能是int64类型;只能是float64或object类型。 - Jeff
当一列的标准差为0时,df.corr()会返回NaN。 - user1244215
它们可能最初是“Int64”,但根据定义,它们是“float64”。然而,如果它们最初就是对象,那么它们仍然可能是“object”。 - Jeff

7
尝试使用以下代码,它仅针对大和非常小的值提供科学计数法(除非省略“,”,否则还会添加千位分隔符):
pd.set_option('display.float_format', lambda x: '%,g' % x)

如果要几乎完全抑制科学计数法而不失精度,请尝试以下方法:

pd.set_option('display.float_format', str)

3

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

pd.options.display.float_format = '{:.0f}'.format

2

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

df['label'].apply(lambda x: '%.17f' % x).values.tolist()

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)

这是一个粗糙的方法,因为你必须在每个赋值语句中使用这个 round 函数。但这确保了你控制它发生的方式并得到你想要的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接