2014-01-05 4 views
73

Ich möchte einen Pandas Datenrahmen mit einem gegebenen Format unter Verwendung print() und des IPython display() anzeigen. Zum Beispiel:Wie Pandas DataFrame von Schwimmern mit einer Formatzeichenfolge für Spalten anzeigen?

df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890], 
        index=['foo','bar','baz','quux'], 
        columns=['cost']) 
print df 

     cost 
foo 123.4567 
bar 234.5678 
baz 345.6789 
quux 456.7890 

würde Ich mag irgendwie dieses in zwingen

Druck
  cost 
foo $123.46 
bar $234.57 
baz $345.68 
quux $456.79 

, ohne dass die Daten selbst zu ändern oder eine Kopie erstellen, sondern nur die Art und Weise ändern, es angezeigt wird.

Wie kann ich das tun?

+2

Ist 'cost' der einzige Schwimmer Spalte, oder gibt es andere Schwimmer Spalten, die nicht mit' $ 'formatiert werden soll? – unutbu

+0

Ich möchte es nur für die Kostenspalte tun (meine realen Daten haben andere Spalten) –

Antwort

127
import pandas as pd 
pd.options.display.float_format = '${:,.2f}'.format 
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890], 
        index=['foo','bar','baz','quux'], 
        columns=['cost']) 
print(df) 

ergibt

 cost 
foo $123.46 
bar $234.57 
baz $345.68 
quux $456.79 

aber dies funktioniert nur, wenn Sie wollen jeder Schwimmer mit einem Dollarzeichen formatiert werden.

Andernfalls, wenn Sie Dollar für einige nur Schwimmern Formatierung wollen, dann denke ich, Sie werden die Datenrahmen (Umwandlung jene Schwimmer in Strings) vorge ändern müssen:

import pandas as pd 
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890], 
        index=['foo','bar','baz','quux'], 
        columns=['cost']) 
df['foo'] = df['cost'] 
df['cost'] = df['cost'].map('${:,.2f}'.format) 
print(df) 

ergibt

  cost  foo 
foo $123.46 123.4567 
bar $234.57 234.5678 
baz $345.68 345.6789 
quux $456.79 456.7890 
+2

Diese Lösung funktioniert nicht in Pandas 0.14. – holocronweaver

+0

Diese Lösung funktioniert immer noch richtig für mich ab Pandas 0.22. –

46

Wenn Sie den Datenrahmen nicht ändern möchten, können Sie einen benutzerdefinierten Formatierer für diese Spalte verwenden.

import pandas as pd 
pd.options.display.float_format = '${:,.2f}'.format 
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890], 
        index=['foo','bar','baz','quux'], 
        columns=['cost']) 


print df.to_string(formatters={'cost':'${:,.2f}'.format}) 

ergibt

 cost 
foo $123.46 
bar $234.57 
baz $345.68 
quux $456.79 
+0

Ist es möglich, den Formatierer auf einer mehrstufigen Spalte arbeiten zu lassen? – user2579685

+0

AFAICT, dieses Beispiel funktioniert ohne die zweite Zeile 'pd.options.display.float_format = '$ {:,. 2f}'. Format' – pianoJames

9

Ähnliche oben unutbu, könnten Sie auch applymap wie folgt verwenden:

import pandas as pd 
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890], 
        index=['foo','bar','baz','quux'], 
        columns=['cost']) 

df = df.applymap("${0:.2f}".format) 
5

As of Pandas 0.17 there is now a styling system, die im Wesentlichen formatiert Ansichten eines Datenrahmen bietet Python format strings mit:

import pandas as pd 
import numpy as np 

constants = pd.DataFrame([('pi',np.pi),('e',np.e)], 
        columns=['name','value']) 
C = constants.style.format({'name': '~~ {} ~~', 'value':'--> {:15.10f} <--'}) 
C 

die zeigt

enter image description here

Dies ist eine Ansicht Objekt; der Datenrahmen selbst ändert sich nicht die Formatierung, aber Aktualisierungen in dem Datenrahmen in der Ansicht wider:

constants.name = ['pie','eek'] 
C 

enter image description here

aber es einige Einschränkungen zu haben scheint:

  • Hinzufügen von neuen Zeilen und/oder In-Place-Spalten scheinen Inkonsistenz in der formatierten Ansicht zu verursachen (fügt keine Zeilen-/Spaltenbeschriftungen hinzu):

    constants.loc[2] = dict(name='bogus', value=123.456) 
    constants['comment'] = ['fee','fie','fo'] 
    constants 
    

enter image description here

denen sieht ok, aber:

C 

enter image description here

  • Formatierung funktioniert nur für Werte, nicht Indexeinträge:

    constants = pd.DataFrame([('pi',np.pi),('e',np.e)], 
           columns=['name','value']) 
    constants.set_index('name',inplace=True) 
    C = constants.style.format({'name': '~~ {} ~~', 'value':'--> {:15.10f} <--'}) 
    C 
    

enter image description here

Verwandte Themen