2015-04-16 10 views
8

Ich habe this und this auf die Formatierung von Gleitkommazahlen für die Anzeige in Pandas gesehen, aber ich bin daran interessiert, das gleiche für Ganzzahlen zu tun.Format Pandas Ganzzahlen für die Anzeige

Gerade jetzt, ich habe

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

Das tut gut mit den Schwimmern in meine Daten, aber entweder ärgerlich hinteren Nullen auf ganze Zahlen verlassen, die Schwimmer gegossen werden, oder ich werde schlicht ganze Zahlen haben, die don Ich werde nicht mit Kommas formatiert.

Die pandas docs erwähnen eine SeriesFormatter Klasse, über die ich keine Informationen finden konnte.

Alternativ, wenn es einen Weg gibt, einen einzigen String-Formatierer zu schreiben, der Fließkommazahlen wie '{:,.2f}' formatiert und mit null hinterem Dezimal als '{:,d}' schwebt, würde das auch funktionieren.

Antwort

8

Sie könnten Affen 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) 

Ausbeuten

 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 

während außerhalb des with-statement:

print(df) 

Ausbeuten

 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 
+0

Schöne Lösung, gibt es eine Möglichkeit, dies auch auszuschalten? –

+1

@leonyin: Sie könnten einen Kontextmanager verwenden. Ich habe den Beitrag geändert, um zu zeigen, was ich meine. – unutbu

+0

Kann HTML-Formatierung vom Aufruf von df beibehalten werden? print (df) ist unformatiert –

Verwandte Themen