web-dev-qa-db-fra.com

Comment afficher les pandas DataFrame de floats en utilisant une chaîne de format pour les colonnes?

Je voudrais afficher une image de pandas avec un format donné en utilisant print() et le IPython display(). Par exemple:

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

Je voudrais en quelque sorte contraindre cela dans l'impression

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

sans avoir à modifier les données elles-mêmes ni à créer une copie, il suffit de changer la façon dont elles sont affichées.

Comment puis-je faire ceci?

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)

les rendements

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

mais cela ne fonctionne que si vous voulez que every float soit formaté avec un signe dollar.

Sinon, si vous souhaitez un formatage dollar pour certains flottants uniquement, alors vous devrez pré-modifier le cadre de données (en les convertissant en chaînes):

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)

les rendements

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

Si vous ne souhaitez pas modifier le cadre de données, vous pouvez utiliser un formateur personnalisé pour cette colonne.

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

les rendements

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79
58
Chris Moore

Depuis Pandas 0.17, il existe maintenant un système de style qui fournit essentiellement des vues formatées d'un DataFrame utilisant Les chaînes de format 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

qui affiche

 enter image description here

Ceci est un objet de vue; le DataFrame lui-même ne change pas le formatage, mais les mises à jour dans le DataFrame sont reflétées dans la vue:

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

 enter image description here

Cependant, il semble y avoir certaines limites:

  • L'ajout de nouvelles lignes et/ou colonnes sur place semble entraîner des incohérences dans la vue stylée (n'ajoute pas d'étiquettes de lignes/colonnes):

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

 enter image description here

qui a l'air correct mais:

C

 enter image description here

  • Le formatage ne fonctionne que pour les valeurs, pas pour les entrées d'index:

    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

Semblable à unutbu ci-dessus, vous pouvez également utiliser applymap comme suit:

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

résumé:


    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

J'aime utiliser pandas.apply () avec le format 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)

En outre, il peut être facilement utilisé avec plusieurs colonnes ...

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