【问题标题】:How to format percentage point differences in Python?如何在 Python 中格式化百分比差异?
【发布时间】:2020-08-03 13:32:47
【问题描述】:

我必须使用 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])

【问题讨论】:

  • 您是否考虑过只做"{:+.3%} ".format(increase).replace('%', 'pp') 而不是尝试使 f-string 输出 'pp' 本身?
  • 这是个好主意。不过,我有一种情况,我有不同的变量类型(百分比、浮点数、整数)可以用作increase 的输入。我目前使用变量类型和格式说明符之间的字典映射来获取我正在寻找的格式。然后可以直接使用格式说明符,而无需实际更改 "{format_specifier}.format(value)" 语法

标签: python


【解决方案1】:

也许你可以用inline pipes 和子类化Format 类做一些事情,但在这种情况下,我认为编写函数来处理它可能更容易:

def pct(num, digits=0):
    return '{:+.{}} pp'.format(num * 100, digits)

...

f"{pct(increase, 4)}"
# '+1.234 pp'

然后,如果需要,您可以将所有这些函数放在它们自己的文件中,并通过在 f-strings 中调用它们来调用它们。

【讨论】:

    【解决方案2】:

    您可以声明自定义格式化程序并通过覆盖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() 不带参数。

    【讨论】:

      【解决方案3】:

      您可以使用以下内容:

      increase = 0.01234
      
      print("{:+.4} {}".format(increase*100, "pp"))
      

      结果:

      +1.234 pp
      

      【讨论】:

      • 这不是 OP 要求的。他们想要相同的输出,但输入是0.01234 而不是1.234
      • 你方便地更改了increase的值
      • @GreenCloakGuy 我编辑了答案以获得相同的输入。
      猜你喜欢
      • 2019-07-03
      • 1970-01-01
      • 2021-05-10
      • 2020-11-27
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多