从Pandas聚合结果中格式化/抑制科学符号

如何修改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)
344501 次浏览

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

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

下面是另一种方法,类似于丹·艾伦的回答,但没有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)

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

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

你可以使用round函数来抑制特定数据帧的科学符号:

df1.round(4)

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

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

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

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

enter image description here

参见文档在这里

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

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

这个的负号是,如果你在浮点数中有最后一个0,它就会切掉它。所以不是0.000070,而是0.00007。

全局设置固定的小数点位数通常是一个坏主意,因为它不太可能为您将显示的所有不同数据提供适当的小数点位数,而不考虑大小。相反,尝试以下方法,它将只为大值和非常小的值提供科学的符号(并添加千位分隔符,除非您省略","):

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

或者在不影响精确度的情况下几乎完全压制科学符号,试试这个:

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

扩展有用的注释,下面是一个解决方案,只设置格式化选项来显示结果,而不永久更改选项:

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