在具有 decimal.Decimal 个条目的 Pandas DataFrame 中控制浮点小数的打印输出?

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

考虑这个例子:

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...

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

我想将 Decimal 对象保留在我的 Pandas DataFrame 中,但是在某些时候,我想用更小的、有限的小数来打印它们——就像 with pd.option_context('float_format',... 用于花车。

在 Pandas DataFrame 中控制 Decimal 的“truncated/rounded 打印输出”是否可行 - 如果是这样,如何实现?

我相信您可以通过更改与小数对象关联的 the context 并重新计算带有小数的列来实现此目的。

请注意,这似乎仅在 Decimal 的计算方式类似于 Decimal(3.0) / Decimal(7) 时才有效。但是如果你的小数很复杂,我认为你可以通过对列中的每个小数对象执行 Decimal(x/y)/Decimal(1) 而不是考虑每个分母 one-by-one.

来解决这个问题

我修改后的代码如下:

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