Pandas format for integers to display

I saw this one and this one for formatting floating point numbers to display in pandas, but I'm interested in doing the same for integers.

I have now

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

This works well with floats in my data, but will either leave annoying trailing zeros on integers that will be cast for float, or I will have prime integers that won't be formatted with commas.

The pandas docs mention the SeriesFormatter class, which I could not find any information about.

Alternatively, if there is a way to write a single line formatter that will format the float as '{:,.2f}' and floats with a null-terminated decimal character as '{:,d}' , this will also work.

+8
python pandas
source share
1 answer

You can use the 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) 

gives

  ABCD 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 

but outside with-statement :

 print(df) 

gives

  ABCD 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 
+8
source share

All Articles