格式化/抑制 Pandas 聚合结果的科学记数法

Posted

技术标签:

【中文标题】格式化/抑制 Pandas 聚合结果的科学记数法【英文标题】:Format / Suppress Scientific Notation from Pandas Aggregation Results 【发布时间】:2014-01-15 12:14:36 【问题描述】:

如何修改 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)

【问题讨论】:

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

当然,我在 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') 一样。【参考方案2】:

这是另一种方法,类似于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 函数的团队成员来说,使用格式字符串会更容易接受。【参考方案3】:

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

df1.round(4)

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

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

【讨论】:

【参考方案4】:

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

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

请参阅文档here。

【讨论】:

【参考方案5】:

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

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

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

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

【讨论】:

谢谢!尽管在某些情况下,第一个选项会失败。【参考方案6】:

我有多个具有不同浮点数的数据帧,所以感谢 Allans 的想法使动态长度。

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

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

【讨论】:

迄今为止投票率最低的答案之一。【参考方案7】:

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

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

【讨论】:

以上是关于格式化/抑制 Pandas 聚合结果的科学记数法的主要内容,如果未能解决你的问题,请参考以下文章

格式化/抑制 Pandas 聚合结果的科学记数法

要列出的 Pandas 数据框系列 - 抑制浮点科学记数法

pandas to_csv:将 pandas 写入 csv 时抑制 csv 文件中的科学记数法

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

R语言ggplot2可视化格式化坐标轴的数值:抑制科学计数法suppress Scientific Notation

R语言ggplot2可视化格式化坐标轴的数值:抑制科学计数法suppress Scientific Notation