我必须使用Python显示两个百分比之间的差异。例如,40%和41.234%之间的差异为1.234个百分点,即1.234页。
如果我想将增长格式化为百分比,我会使用格式说明符{:.0%}
:
increase = 0.01234
"{:+.3%} ".format(increase)
>>> "+1.234 %"
我在找什么
用pp
替换%
的格式说明符,如下所示:
"{some_specifier} ".format(increase)
>>> "+1.234 pp"
我不想找什么
我知道我可以使用像这样的f字符串
f"{increase * 100:+.3f} pp"
>>> "+1.234 pp"
但我特别想找一个可以与.format()
一起使用的格式说明符。
编辑
我意识到一点背景知识在这里可能有用。在我的实现中,increase
可以表示一个普通的浮点、整数、百分比或百分点。为了获得正确的表示,我使用了一个看起来像的可变格式映射
format_mapping = {
"var_x": "{:,.0f}", # for large numbers
"var_y": "{:+.3f}", # for small numbers
"var_z": "{:.4%}", # for percentages
}
变量名表示pandas数据帧my_data
的列名,因此为了报告,我可以将格式应用于这些列
for var in my_data.columns:
fmt = format_mapping[var]
my_data[var] = pd.Series(fmt.format(value) for value in my_data[var])
使用内联管道和Format
类的子类可能可以做一些事情,但在这种情况下,我认为只编写函数来处理它可能更容易:
def pct(num, digits=0):
return '{:+.{}} pp'.format(num * 100, digits)
...
f"{pct(increase, 4)}"
# '+1.234 pp'
然后,如果需要,可以将所有这些函数放在它们自己的文件中,并通过在f-string中调用它们来调用它们。
您可以声明自定义格式化程序,并通过重写Formatter.format_field()
方法将"%"
替换为"pp"
:
from string import Formatter
class MyFormatter(Formatter):
def format_field(self, value, spec):
if spec.endswith("p"):
return super(MyFormatter, self).format_field(value, spec[:-1] + "%")[:-1] + "pp"
else:
return super(MyFormatter, self).format_field(value, spec)
用法:
print(MyFormatter().format("%: {0:+.3%}; pp: {0:+.3p}", 0.01234))
附言:在python 3中,您可以在没有参数的情况下使用super()
。
您可以使用以下内容:
increase = 0.01234
print("{:+.4} {}".format(increase*100, "pp"))
结果:
+1.234 pp