【问题标题】:Format / Suppress Scientific Notation from Pandas Aggregation Results格式化/抑制 Pandas 聚合结果的科学记数法
【发布时间】:2014-02-03 21:44:33
【问题描述】:

如何修改 pandas 中的 groupby 操作的输出格式,该操作为非常大的数字生成科学记数法?

我知道如何在 python 中进行字符串格式化,但是在这里应用它时我不知所措。

df1.groupby('dept')['data1'].sum()

dept
value1       1.192433e+08
value2       1.293066e+08
value3       1.077142e+08

如果我转换为字符串,这会抑制科学记数法,但现在我只是想知道如何格式化字符串和添加小数。

sum_sales_dept.astype(str)

【问题讨论】:

  • 我看到了这个问题,但我不确定这对我有什么帮助。我只是想保留当前的浮点数据类型,并在结果中简单地显示所有小数而不是科学记数法。
  • 这可能只是一个展示的东西。但是,如果您认为您的问题有什么特别之处使您的问题与 Dan 的链接中的问题不同,那么您需要发布有关您的问题的更多信息,最好使用重现问题的小型数据集。另外,您的结果中的dtypes 是什么?

标签: python pandas floating-point scientific-notation number-formatting


【解决方案1】:

在全局范围内设置固定的小数位数通常不是一个好主意,因为对于您将显示的所有各种数据,无论大小如何,它都不太可能是适当的小数位数。相反,试试这个,它只会为您提供大和非常小的值的科学记数法(并添加千位分隔符,除非您省略“,”):

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

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

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

【讨论】:

  • 谢谢!尽管在某些情况下,第一个选项会失败。
【解决方案2】:

我有多个具有不同浮点数的数据帧,因此感谢 Allans 的想法制作了动态长度。

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

这个缺点是如果你有最后一个 0 在浮动,它会削减它。所以它不会是 0.000070,而是 0.00007。

【讨论】:

  • 迄今为止投票率最低的答案之一。
【解决方案3】:

如果您想在 jupyter 笔记本单元格中设置数据框的输出样式,您可以基于每个数据框设置显示样式:

df = pd.DataFrame({'A': np.random.randn(4)*1e7})
df.style.format("{:.1f}")

请参阅文档here

【讨论】:

    【解决方案4】:

    这是另一种方法,类似于Dan Allan's answer,但没有 lambda 函数:

    >>> pd.options.display.float_format = '{:.2f}'.format
    >>> Series(np.random.randn(3))
    0    0.41
    1    0.99
    2    0.10
    

    >>> pd.set_option('display.float_format', '{:.2f}'.format)
    

    【讨论】:

    • 我认为对于不太熟悉 Python 并且可能不理解 lambda 函数的团队成员来说,使用格式字符串会更容易接受。
    【解决方案5】:

    您可以使用 round 函数来抑制特定数据帧的科学记数法:

    df1.round(4)
    

    或者你可以通过以下方式全局抑制:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        当然,我在 cmets 中链接的答案不是很有帮助。您可以像这样指定自己的字符串转换器。

        In [25]: pd.set_option('display.float_format', lambda x: '%.3f' % x)
        
        In [28]: Series(np.random.randn(3))*1000000000
        Out[28]: 
        0    -757322420.605
        1   -1436160588.997
        2   -1235116117.064
        dtype: float64
        

        我不确定这是否是首选方法,但它确实有效。

        纯粹出于审美目的将数字转换为字符串似乎是个坏主意,但如果你有充分的理由,这是一种方法:

        In [6]: Series(np.random.randn(3)).apply(lambda x: '%.3f' % x)
        Out[6]: 
        0     0.026
        1    -0.482
        2    -0.694
        dtype: object
        

        【讨论】:

        • 谢谢丹。你知道如何重置 pandas 选项吗?
        • @Josh 要在 pandas 中临时设置选项,您可以使用pandas.option_context(参见pandas.pydata.org/pandas-docs/stable/generated/…)。
        • 这通常不是为了审美目的,而是为了通过视觉皮层在大型数字数据帧上更快地浏览信息。
        • pd.set_option('display.float_format', lambda x: '%.3f' % x) 也为我工作
        • 这行得通,您也可以使用较新的 f 字符串表示法。如果你也想要千位分隔符,就像 pd.set_option('display.float_format', lambda x: f'{x:,.3f}') 一样。
        猜你喜欢
        • 2021-12-18
        • 2021-06-17
        • 2013-07-18
        • 2020-05-31
        • 2017-03-13
        相关资源
        最近更新 更多