在Pandas中禁止使用科学记数法?[副本]

ar7v8xwq  于 2023-08-01  发布在  其他
关注(0)|答案(6)|浏览(105)

此问题已在此处有答案

Format / Suppress Scientific Notation from Pandas Aggregation Results(8个回答)
去年关闭。
社区在11天前审查了是否重新打开这个问题,并关闭了它:

重复这个问题已经回答,不是唯一的,并且与另一个问题没有区别。

我在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()似乎只能为所有其他浮点值打开它,而没有能力关闭它。

mspsb9vt

mspsb9vt1#

快速临时:第一个月
全局:pd.options.display.float_format = '{:20,.2f}'.format
:20意味着总宽度应该是20个字符,如果它会更短,则在左边填充空白。如果不想指定数字,可以简单地使用'{:,.2f}'
.2f意味着小数点后应该有两位数字,即使它们是零。

vkc1a9a2

vkc1a9a22#

您的数据可能是object dtype。这是您数据的直接复制/粘贴。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


这会将此帧转换为object dtype(注意,现在的打印很有趣)

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 dtype帧的外观

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

au9on6nz

au9on6nz3#

尝试这个方法,它只会为你提供大的和非常小的值的科学符号(并添加千分之一的分隔符,除非你省略了“,”):

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

字符串
或者,为了几乎完全抑制科学记数法而不损失精度,请尝试以下操作:

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

daolsyd0

daolsyd04#

无圆角快速修复:

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

字符串

wmtdaxz3

wmtdaxz35#

如果你想在列表中使用格式化的字符串,比如作为csv文件csv.writier的一部分,可以在创建列表之前格式化数字:

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

字符串

tjjdgumg

tjjdgumg6#

我试过了所有的选择

  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)
    但对我都没用
    因此,在将变量/值(var 1)赋值给变量(比如num 1)时,我使用了round(val,5)。
num1 = round(var1,5)

字符串
这是一个粗糙的方法,因为你必须在每个赋值中使用这个轮函数。但这确保了你控制它是如何发生的,并得到你想要的。

相关问题