Come visualizzare i panda DataFrame dei float usando una stringa di formato per le colonne?


166

Vorrei visualizzare un frame di dati Panda con un determinato formato utilizzando print()e IPython display(). Per esempio:

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

Vorrei in qualche modo costringere questo alla stampa

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

senza dover modificare i dati stessi o creare una copia, basta cambiare il modo in cui vengono visualizzati.

Come posso fare questo?


2
È costl'unica colonna float o ci sono altre colonne float che non devono essere formattate $?
unutbu,

Vorrei farlo solo per la colonna dei costi (i miei dati reali hanno altre colonne)
Jason S

mi rendo conto che una volta che $ è allegato, il tipo di dati cambia automaticamente in oggetto.
Nguai al

Risposte:


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)

i rendimenti

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

ma questo funziona solo se vuoi che ogni float sia formattato con un simbolo di dollaro.

Altrimenti, se vuoi la formattazione in dollari solo per alcuni float, allora penso che dovrai pre-modificare il dataframe (convertendo quei float in stringhe):

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)

i rendimenti

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

3
Questa soluzione funziona ancora correttamente per me a partire da Panda 0.22.
Taylor Edmiston,

19
come mostrato ad esempio qui , puoi modificare le opzioni solo per un dato blocco usandowith pd.option_context('display.float_format', '${:,.2f}'.format'):
Andre Holzner il

1
Extra 'prima della parentesi di chiusura sul commento di @AndreHolzner; altrimenti, funziona come un fascino!
dTanMan il

67

Se non si desidera modificare il frame di dati, è possibile utilizzare un formattatore personalizzato per quella colonna.

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})

i rendimenti

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

2
È possibile far funzionare il formatter su una colonna multilivello?
user2579685,

3
AFAICT, questo esempio funziona senza la seconda rigapd.options.display.float_format = '${:,.2f}'.format
pianoJames

56

Come di Panda 0,17 ora c'è un sistema di styling che prevede essenzialmente viste formattate di un dataframe utilizzando stringhe di formato Python :

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

che visualizza

inserisci qui la descrizione dell'immagine

Questo è un oggetto vista; DataFrame stesso non cambia la formattazione, ma gli aggiornamenti in DataFrame si riflettono nella vista:

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

inserisci qui la descrizione dell'immagine

Tuttavia sembra avere alcune limitazioni:

  • L'aggiunta di nuove righe e / o colonne sul posto sembra causare incoerenza nella vista con stile (non aggiunge etichette di riga / colonna):

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

inserisci qui la descrizione dell'immagine

che sembra ok ma:

C

inserisci qui la descrizione dell'immagine

  • La formattazione funziona solo per i valori, non per le voci di indice:

    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

inserisci qui la descrizione dell'immagine


2
Posso usare DataFrame.style dall'interno dell'interprete?
Jms

23

Simile a unutbu sopra, puoi anche usare applymapcome segue:

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)

Mi piace usare questo approccio prima di chiamare df.to_csv()per assicurarmi che tutte le colonne nel mio .csvfile abbiano la stessa "larghezza delle cifre". Grazie!
jeschwar,

5

Mi piace usare pandas.apply () con il formato python ().

import pandas as pd
s = pd.Series([1.357, 1.489, 2.333333])

make_float = lambda x: "${:,.2f}".format(x)
s.apply(make_float)

Inoltre, può essere facilmente utilizzato con più colonne ...

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)

2

Puoi anche impostare le impostazioni internazionali sulla tua regione e impostare float_format per utilizzare un formato valuta. Ciò imposterà automaticamente il segno $ per la valuta negli Stati Uniti.

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

0

sommario:


    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
    """
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.