Can you format pandas integers for display, like `pd.options.display.float_format` for floats?

前端 未结 2 811
耶瑟儿~
耶瑟儿~ 2020-12-06 04:23

I\'ve seen this and this on formatting floating-point numbers for display in pandas, but I\'m interested in doing the same thing for integers

2条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-06 04:58

    You could monkey-patch 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)
    

    yields

          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
    

    while outside of the with-statement:

    print(df)
    

    yields

          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
    

提交回复
热议问题