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?
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
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
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
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
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
qui a l'air correct mais:
C
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
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)
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
"""
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)