¿Cómo mostrar pandas DataFrame de flotadores usando una cadena de formato para columnas?

Me gustaría mostrar un dataframe de pandas con un formato determinado utilizando print() y la display() IPython display() . Por ejemplo:

 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 

Me gustaría forzar de alguna manera esto para imprimir

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

sin tener que modificar los datos en sí ni crear una copia, simplemente cambie la forma en que se muestran.

¿Cómo puedo hacer esto?

 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) 

rendimientos

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

pero esto solo funciona si desea que cada flotador sea formateado con un signo de dólar.

De lo contrario, si solo desea el formato en dólares para algunos flotantes, creo que tendrá que modificar previamente el dataframe (convirtiendo esos flotantes en cadenas):

 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) 

rendimientos

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

Si no desea modificar el dataframe, puede usar un formateador personalizado para esa columna.

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

rendimientos

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

A partir de Pandas 0.17 ahora hay un sistema de estilo que esencialmente proporciona vistas formateadas de un DataFrame usando cadenas de 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 

que muestra

introduzca la descripción de la imagen aquí

Este es un objeto de vista; el propio DataFrame no cambia el formato, pero las actualizaciones en el DataFrame se reflejan en la vista:

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

introduzca la descripción de la imagen aquí

Sin embargo, parece tener algunas limitaciones:

  • Agregar nuevas filas y / o columnas en el lugar parece causar inconsistencias en la vista de estilo (no agrega tags de fila / columna):

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

introduzca la descripción de la imagen aquí

que se ve bien pero

 C 

introduzca la descripción de la imagen aquí

  • El formato funciona solo para valores, no para entradas de índice:

     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 

introduzca la descripción de la imagen aquí

Similar a unutbu anterior, también podría usar applymap siguiente manera:

 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) 

Me gusta usar pandas.apply () con el 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) 

Además, se puede usar fácilmente con varias columnas …

 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) 

resumen:

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