Me gustaría mostrar un pandas dataframe con un formato determinado mediante print() y el 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 de alguna manera de coaccionar esta en la impresión de

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

sin tener que modificar los datos o crear una copia, simplemente cambiar la forma en que se muestra.

¿Cómo puedo hacer esto?

  • Es cost la única columna float, o hay otras columnas float que no debe ser formateado con $?
  • Me gustaría hacerlo por el costo solamente la columna (mis datos reales tiene otras columnas)
  • me doy cuenta de que una vez que $ se adjunta, el tipo de datos de forma automática los cambios al objeto.
InformationsquelleAutor Jason S | 2014-01-05

6 Comentarios

  1. 219
    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 sólo funciona si usted desea cada flotador para ser formateado con un signo de dólar.

    Si por el contrario queremos dólar formato para algunas carrozas sólo, entonces creo que voy a tener que modificar el dataframe (la conversión de los flotadores para las 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
    • Esta solución no funciona en Pandas 0.14.
    • Esta solución todavía funciona correctamente para mí, como de pandas de 0,22.
    • como se muestra por ejemplo, aquí, usted puede modificar las opciones sólo para un determinado bloque mediante with pd.option_context('display.float_format', '${:,.2f}'.format'):
  2. 63

    Si no se desea modificar el dataframe, usted podría utilizar 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
    • Es posible conseguir el formateador para trabajar en un negocio multinivel columna?
    • AFAICT, en este ejemplo se trabaja sin la segunda línea pd.options.display.float_format = '${:,.2f}'.format
  3. 42

    Como de Pandas 0.17 ahora hay un estilo de sistema que básicamente ofrece vistas con formato de un DataFrame utilizando Python cadenas de formato:

    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

    Cómo mostrar los pandas DataFrame de flota mediante una cadena de formato para las columnas?

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

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

    Cómo mostrar los pandas DataFrame de flota mediante una cadena de formato para las columnas?

    Sin embargo parece que tiene algunas limitaciones:

    • Agregar nuevas filas y/o columnas en lugar parece ser la causa de la inconsistencia en el estilo de la vista (no añadir fila/columna de etiquetas):

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

    Cómo mostrar los pandas DataFrame de flota mediante una cadena de formato para las columnas?

    que se ve bien, pero:

    C

    Cómo mostrar los pandas DataFrame de flota mediante una cadena de formato para las columnas?

    • Formato funciona sólo para los valores, no de las 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

    Cómo mostrar los pandas DataFrame de flota mediante una cadena de formato para las columnas?

    • Este debe ser ahora la aceptan, la respuesta…
    • ¿Puedo usar el DataFrame.el estilo del interior de la intérprete?
  4. 17

    Similar a unutbu anterior, también se podría utilizar applymap de la 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 el uso de este enfoque antes de llamar a df.to_csv() para asegurarse de que todas las columnas en mi .csv archivo tiene el mismo «anchura de dígitos.» Gracias!
  5. 1

    Me gusta el uso de los pandas.aplicar() con python (formato).

    import pandas as pd
    s = pd.Series([1.357, 1.489, 2.333333])
    
    make_float = lambda x: "${:,.2f}".format(x)
    s.apply(make_float)

    También, puede ser utilizado 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)
  6. 0

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

Dejar respuesta

Please enter your comment!
Please enter your name here