Ich möchte einen Pandas-Datenrahmen mit einem bestimmten Format anzeigen, der print()
und IPython display()
verwendet. Zum Beispiel:
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
Ich möchte das irgendwie zum Drucken zwingen
cost
foo $123.46
bar $234.57
baz $345.68
quux $456.79
ohne die Daten selbst ändern oder eine Kopie erstellen zu müssen, ändern Sie einfach die Art und Weise, wie sie angezeigt werden.
Wie kann ich das machen?
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)
erträge
cost
foo $123.46
bar $234.57
baz $345.68
quux $456.79
dies funktioniert jedoch nur, wenn Sie möchten, dass Every Float mit einem Dollarzeichen formatiert wird.
Ansonsten, wenn Sie die Dollar-Formatierung nur für einige Floats wünschen, müssen Sie den Datenrahmen vorab ändern (Konvertierung dieser Floats in Strings):
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)
erträge
cost foo
foo $123.46 123.4567
bar $234.57 234.5678
baz $345.68 345.6789
quux $456.79 456.7890
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})
erträge
cost
foo $123.46
bar $234.57
baz $345.68
quux $456.79
Ab Pandas 0.17 gibt es jetzt ein Styling-System , das im Wesentlichen formatierte Ansichten eines DataFrame mithilfe von Python-Formatzeichenfolgen bereitstellt :
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
welche zeigt
Dies ist ein Ansichtsobjekt. Der DataFrame selbst ändert die Formatierung nicht, aber Aktualisierungen im DataFrame werden in der Ansicht angezeigt:
constants.name = ['pie','eek']
C
Es scheint jedoch einige Einschränkungen zu haben:
Das Hinzufügen neuer Zeilen und/oder Spalten an Ort und Stelle scheint Inkonsistenzen in der Stilansicht zu verursachen (fügt keine Zeilen-/Spaltenbeschriftungen hinzu):
constants.loc[2] = dict(name='bogus', value=123.456)
constants['comment'] = ['fee','fie','fo']
constants
was sieht ok aus aber:
C
Die Formatierung funktioniert nur für Werte, nicht für 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
Ähnlich wie oben bei unutbu können Sie applymap
auch 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)
zusammenfassung:
df = pd.DataFrame({'money': [100.456, 200.789], 'share': ['100,000', '200,000']})
print(df)
print(df.to_string(formatters={'money': '${:,.2f}'.format}))
for col_name in ('share',):
df[col_name] = df[col_name].map(lambda p: int(p.replace(',', '')))
print(df)
"""
money share
0 100.456 100,000
1 200.789 200,000
money share
0 $100.46 100,000
1 $200.79 200,000
money share
0 100.456 100000
1 200.789 200000
"""
Ich mag es, pandas.apply () mit Python-Format () zu verwenden.
import pandas as pd
s = pd.Series([1.357, 1.489, 2.333333])
make_float = lambda x: "${:,.2f}".format(x)
s.apply(make_float)
Es kann auch problemlos mit mehreren Spalten verwendet werden ...
df = pd.concat([s, s * 2], axis=1)
make_floats = lambda row: "${:,.2f}, ${:,.3f}".format(row[0], row[1])
df.apply(make_floats, axis=1)