在具有 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。如测试代码打印输出所示:
- 浮动打印输出已从
0.428571
截断为 0.4286
,正如预期的那样
- 但是,Decimal 对象仍然打印有大量小数
我想将 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
考虑这个例子:
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。如测试代码打印输出所示:
- 浮动打印输出已从
0.428571
截断为0.4286
,正如预期的那样 - 但是,Decimal 对象仍然打印有大量小数
我想将 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