格式化/禁止Pandas聚合结果的科学符号

hrirmatl  于 2023-05-05  发布在  其他
关注(0)|答案(9)|浏览(240)

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

nwo49xxi1#

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

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
nimxete2

nimxete22#

下面是另一种方法,类似于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)
flseospp

flseospp3#

您可以使用round函数来抑制特定 Dataframe 的科学计数法:

df1.round(4)

也可以通过以下方式全局抑制:

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

z8dt9xmd4#

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

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

请参阅此处的文档。

zbsbpyhn

zbsbpyhn5#

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

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

或者,为了几乎完全抑制科学记数法而不损失精度,请尝试以下操作:

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

4zcjmb1e6#

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

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

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

vhmi4jdf

vhmi4jdf7#

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

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
tf7tbtn2

tf7tbtn28#

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

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

vmpqdwk39#

这个问题我已经提了至少十几次了,因为我总是忘记怎么做。我发现了一个更简单的解决方案,这里没有提到使用pandas.DataFrame.round

df.describe().round(5)

df.column.describe().round(5)

相关问题