格式化/抑制 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 to_csv:将 pandas 写入 csv 时抑制 csv 文件中的科学记数法
Python使用pandas设置数据列中float数据类型的有效小数位数抑制科学计数法