Wie werden Pandas DataFrame von Floats mithilfe einer Formatzeichenfolge für Spalten angezeigt?

164

Ich möchte einen Pandas-Datenrahmen mit einem bestimmten Format unter Verwendung von print()und IPython anzeigen display(). Beispielsweise:

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?

Jason S.
quelle
2
Ist costdie einzige Float-Spalte oder gibt es andere Float-Spalten, mit denen nicht formatiert werden sollte $?
Unutbu
Ich möchte es nur für die Kostenspalte tun (meine realen Daten haben andere Spalten)
Jason S
Ich erkenne, dass sich der Datentyp automatisch in ein Objekt ändert, sobald $ angehängt ist.
Nguai al

Antworten:

284
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

Dies funktioniert jedoch nur, wenn jeder Float mit einem Dollarzeichen formatiert werden soll.

Wenn Sie andernfalls die Dollar-Formatierung nur für einige Floats wünschen, müssen Sie den Datenrahmen meiner Meinung nach vorab ändern (diese Floats in Zeichenfolgen konvertieren):

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
unutbu
quelle
3
Diese Lösung funktioniert für mich ab Pandas 0.22 immer noch einwandfrei.
Taylor Edmiston
19
wie gezeigt , zum Beispiel hier , können Sie die Optionen nur für den einen gegebenen Block unter Verwendung ändernwith pd.option_context('display.float_format', '${:,.2f}'.format'):
Andre Holzner
1
Extra 'vor der schließenden Klammer zum Kommentar von @AndreHolzner; Ansonsten funktioniert es wie ein Zauber!
dTanMan
67

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
Chris Moore
quelle
2
Ist es möglich, den Formatierer dazu zu bringen, an einer mehrstufigen Spalte zu arbeiten?
user2579685
3
AFAICT, dieses Beispiel funktioniert ohne die zweite Zeilepd.options.display.float_format = '${:,.2f}'.format
PianoJames
55

Ab Pandas 0.17 gibt es jetzt ein Styling-System, das im Wesentlichen formatierte Ansichten eines DataFrame mit 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 anzeigt

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

Es scheint jedoch einige Einschränkungen zu geben:

  • Das Hinzufügen neuer Zeilen und / oder Spalten an Ort und Stelle scheint zu Inkonsistenzen in der gestalteten Ansicht zu führen (fügt keine Zeilen- / Spaltenbeschriftungen hinzu):

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

Geben Sie hier die Bildbeschreibung ein

das sieht ok aus aber:

C

Geben Sie hier die Bildbeschreibung ein

  • 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
    

Geben Sie hier die Bildbeschreibung ein

Jason S.
quelle
2
Kann ich den DataFrame.style im Interpreter verwenden?
Jms
23

Ähnlich wie bei Unutbu oben können Sie auch applymapFolgendes 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)
sedeh
quelle
Ich verwende diesen Ansatz gerne vor dem Aufruf df.to_csv(), um sicherzustellen, dass alle Spalten in meiner .csvDatei dieselbe "Ziffernbreite" haben. Vielen Dank!
Jeschwar
5

Ich benutze gerne pandas.apply () mit dem Python-Format ().

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 leicht 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)
Sela
quelle
2

Sie können auch das Gebietsschema für Ihre Region festlegen und float_format so einstellen, dass ein Währungsformat verwendet wird. Dadurch wird automatisch das $ -Zeichen für die Währung in den USA festgelegt.

import locale

locale.setlocale(locale.LC_ALL, "en_US.UTF-8")

pd.set_option("float_format", locale.currency)

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

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79
Vlad Bezden
quelle
0

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
    """
Carson
quelle