it-swarm.com.de

Wie kann man Pandas DataFrame von Floats mithilfe einer Formatzeichenfolge für Spalten anzeigen?

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?

101
Jason S
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
183
unutbu

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
58
Chris Moore

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

 enter image description here

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

 enter image description here

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
    

 enter image description here

was sieht ok aus aber:

C

 enter image description here

  • 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
    

 enter image description here

25
Jason S

Ä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)
16
sedeh

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
    """
0
Carson Arucard

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)
0
Selah