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

hor*_*01d 127 python floating-point scientific-notation number-formatting pandas

如何修改pandas中groupby操作的输出格式,为大数字生成科学记数法.我知道如何在python中进行字符串格式化,但是在这里应用它时我感到很茫然.

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

dept
value1       1.192433e+08
value2       1.293066e+08
value3       1.077142e+08
Run Code Online (Sandbox Code Playgroud)

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

sum_sales_dept.astype(str)
Run Code Online (Sandbox Code Playgroud)

Dan*_*lan 193

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

  • 这可行,您还可以使用较新的 f 字符串表示法。如果您还想要千位分隔符,请像“pd.set_option('display.float_format', lambda x: f'{x:,.3f}')”一样。 (9认同)
  • @Josh 要在 Pandas 中临时设置选项,您可以使用 `pandas.option_context`(请参阅 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.option_context.html)。 (2认同)
  • 它通常不是为了美观的目的,而是为了通过视觉皮层在大型数字数据帧上更快地浏览信息。 (2认同)

小智 67

这是另一种方法,类似于Dan Allan的答案,但没有lambda函数:

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

要么

>>> pd.set_option('display.float_format', '{:.2f}'.format)
Run Code Online (Sandbox Code Playgroud)

  • 我认为使用格式字符串对于不太熟悉 Python 并且可能不理解 lambda 函数的团队成员会更容易上手。 (2认同)

Vla*_*den 19

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

df1.round(4)
Run Code Online (Sandbox Code Playgroud)

或者你可以压制全球:

pd.options.display.float_format = '{:.4f}'.format
Run Code Online (Sandbox Code Playgroud)


flo*_*tan 17

如果要在 jupyter notebook 单元格中设置数据框输出的样式,可以在每个数据框的基础上设置显示样式:

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

在此处输入图片说明

请参阅此处的文档。


Ful*_*ife 7

我有多个具有不同浮点的数据帧,因此感谢 Allans 的想法,使其成为动态长度。

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

这样做的缺点是,如果你在 float 中最后有 0,它会削减它。所以它不会是 0.000070,而是 0.00007。


gib*_*one 7

扩展这个有用的评论,这里是一个解决方案,设置格式选项仅显示结果而不永久更改选项:

with pd.option_context('display.float_format', lambda x: f'{x:,.3f}'):
    display(sum_sales_dept)

dept
value1  119,243,300.0
value2  129,306,600.0
value3  107,714,200.0
Run Code Online (Sandbox Code Playgroud)


dab*_*bru 6

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

pd.set_option('display.float_format', lambda x: '%,g' % x)
Run Code Online (Sandbox Code Playgroud)

或者要在不损失精度的情况下几乎完全抑制科学记数法,请尝试以下操作:

pd.set_option('display.float_format', str)
Run Code Online (Sandbox Code Playgroud)