控制浮点小数的打印输出,在 Pandas DataFrame 中使用小数。小数点后条目?

Control printout of floating point decimals, in Pandas DataFrame with decimal.Decimal entries?

提问人:sdbbs 提问时间:1/30/2022 更新时间:1/30/2022 访问量:1098

问:

请看这个例子:

import pandas as pd
from decimal import Decimal

my_df = pd.DataFrame(columns=["a", "b", "c"])
my_df = my_df.append({'a': 1, 'b': 3.0/7, 'c': Decimal(3.0/7)}, ignore_index=True)
print(my_df)

print("-------")

with pd.option_context('float_format', '{:.4f}'.format, 'display.expand_frame_repr', False):
  print(my_df)

这将打印出:

   a         b                                                  c
0  1  0.428571  0.42857142857142854763807804374664556235074996...
-------
   a      b                                                  c
0  1 0.4286  0.42857142857142854763807804374664556235074996...

意识到可以在 Pandas DataFrame 中控制浮点数中小数点数的打印输出,我尝试将相同的方法应用于元素,该元素是类的。如测试代码打印输出所示:pd.option_context('float_format',...decimal.Decimal

  • 如预期的那样,浮点打印输出已从 到 截断0.4285710.4286
  • 但是,Decimal 对象仍然打印有大量小数

我想在我的 Pandas DataFrame 中保留 Decimal 对象,但是在某些时候,我想用更少、有限数量的小数来打印它们 - 就像浮点数一样。with pd.option_context('float_format',...

在 Pandas DataFrame 中,这种受控的 Decimal 的“截断/四舍五入打印输出”是否可行 - 如果是这样,如何才能做到?

Python pandas 十进制 精度

评论


答:

3赞 Richard K Yu 1/30/2022 #1

我相信您可以做到这一点的一种方法是更改与 decimal 对象关联的上下文并使用小数重新计算列。

请注意,这似乎只有在 Decimal 的计算方式为 时才有效。但是,如果你的小数很复杂,我认为你可以通过对列中的每个小数对象进行处理来解决这个问题,而不是一个接一个地考虑每个分母。Decimal(3.0) / Decimal(7)Decimal(x/y)/Decimal(1)

我修改后的代码如下所示:

import pandas as pd
from decimal import *


my_df = pd.DataFrame(columns=["a", "b", "c"])
my_df = my_df.append({'a': 1, 'b': 3.0/7, 'c': Decimal(3.0)/Decimal(7)}, ignore_index=True)
print(my_df)

print("-------")



#We change the precision and then reinitialize the ['c'] column with the same decimal objects.
getcontext().prec = 4
my_df['c'] = [Decimal(3.0)/Decimal(7)]

with pd.option_context('float_format', '{:.4f}'.format, 'display.expand_frame_repr', False):
  
  print(my_df)

输出:

   a         b                               c
0  1  0.428571  0.4285714285714285714285714286
-------
   a      b       c
0  1 0.4286  0.4286