【问题标题】:Can you format pandas integers for display, like `pd.options.display.float_format` for floats?你可以格式化 pandas 整数以进行显示,例如用于浮点数的 `pd.options.display.float_format` 吗?
【发布时间】:2015-06-22 04:23:13
【问题描述】:

我已经看到 thisthis 在格式化 浮点 数字以在 pandas 中显示,但我有兴趣为 整数做同样的事情>。

现在,我有:

pd.options.display.float_format = '{:,.2f}'.format

这适用于我数据中的浮点数,但要么会在转换为浮点数的整数上留下烦人的尾随零,要么我会得到不使用逗号格式化的纯整数。

pandas 文档提到了一个 SeriesFormatter 类,我找不到任何相关信息。

或者,如果有一种方法可以编写一个字符串格式化程序,它将浮点数格式化为'{:,.2f}',并以零尾随小数浮点数作为'{:,d}',那也可以。

【问题讨论】:

    标签: python pandas formatting number-formatting


    【解决方案1】:

    你可以猴子补丁pandas.io.formats.format.IntArrayFormatter:

    import contextlib
    import numpy as np
    import pandas as pd
    import pandas.io.formats.format as pf
    np.random.seed(2015)
    
    @contextlib.contextmanager
    def custom_formatting():
        orig_float_format = pd.options.display.float_format
        orig_int_format = pf.IntArrayFormatter
    
        pd.options.display.float_format = '{:0,.2f}'.format
        class IntArrayFormatter(pf.GenericArrayFormatter):
            def _format_strings(self):
                formatter = self.formatter or '{:,d}'.format
                fmt_values = [formatter(x) for x in self.values]
                return fmt_values
        pf.IntArrayFormatter = IntArrayFormatter
        yield
        pd.options.display.float_format = orig_float_format
        pf.IntArrayFormatter = orig_int_format
    
    
    df = pd.DataFrame(np.random.randint(10000, size=(5,3)), columns=list('ABC'))
    df['D'] = np.random.random(df.shape[0])*10000
    
    with custom_formatting():
        print(df)
    

    产量

          A     B     C        D
    0 2,658 2,828 4,540 8,961.77
    1 9,506 2,734 9,805 2,221.86
    2 3,765 4,152 4,583 2,011.82
    3 5,244 5,395 7,485 8,656.08
    4 9,107 6,033 5,998 2,942.53
    

    with-statement之外:

    print(df)
    

    产量

          A     B     C            D
    0  2658  2828  4540  8961.765260
    1  9506  2734  9805  2221.864779
    2  3765  4152  4583  2011.823701
    3  5244  5395  7485  8656.075610
    4  9107  6033  5998  2942.530551
    

    【讨论】:

    • 不错的解决方案,有没有办法关闭它?
    • @leonyin:您可以使用上下文管理器。我已经修改了帖子以说明我的意思。
    • 可以通过调用df来维护html格式吗? print(df) 未格式化
    • @leonyin: print(df.to_html())with-statement 中生成自定义格式的 HTML。
    • Neat hack,您应该将其提交给 pandas 食谱,并作为对 pd.options.display.int_format 的任何增强请求的评论。我认为这不会在酸洗后存活,值得注意。
    【解决方案2】:

    Jupyter 笔记本的另一个选项是使用 df.style.format('{:,}'),但据我所知,它只适用于单个数据帧,因此您每次都必须调用它:

    table.style.format('{:,}')
              col1       col2
    0s   9,246,452  6,669,310
    >0   2,513,002  5,090,144
    
    table
           col1     col2
    0s  9246452  6669310
    >0  2513002  5090144
    

    Styling — pandas 1.1.2 documentation

    【讨论】:

    • 当数据框包含str 列时,这似乎不起作用,引发以下错误:ValueError: Cannot specify ',' with 's'. 有没有办法使用样式函数来解决这个问题?
    • @Farid 你可能有几个选项,文档(上面链接)说.format 可以接受一个函数,所以你可以有一个函数来检查类型,然后格式化不同于数字的字符串.另一种选择是.format 可以采用dict,其中键指定列,值是不同列的不同格式。
    【解决方案3】:

    从 Pandas 1.3.0 开始,您可以指定 df.style.format(thousands=',') 以使用逗号分隔浮点数、复数和整数中的千位。

    请参阅:https://pandas.pydata.org/docs/reference/api/pandas.io.formats.style.Styler.format.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      相关资源
      最近更新 更多