Как отобразить pandas DataFrame для float, используя строку формата для столбцов?

Я хотел бы отобразить фреймворк pandas с заданным форматом, используя print() и IPython display(). Например:

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

Я хотел бы как-то принудить это к печати

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

не изменяя сами данные или не создавая копию, просто измените способ отображения.

Как я могу это сделать?

Ответ 1

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)

дает

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

но это работает только в том случае, если вы хотите, чтобы каждый поплавок отформатировался со знаком доллара.

В противном случае, если вы хотите форматировать доллар только для некоторых поплавков, то я думаю, вам придется предварительно модифицировать фрейм данных (конвертируя эти поплавки в строки):

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)

дает

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

Ответ 2

Если вы не хотите изменять фрейм данных, вы можете использовать пользовательский форматтер для этого столбца.

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

дает

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

Ответ 3

Начиная с Pandas 0.17 теперь существует система стилей, которая по существу предоставляет отформатированные представления DataFrame с использованием строк формата 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

который отображает

enter image description here

Это объект просмотра; сам DataFrame не меняет форматирование, но обновления в DataFrame отражаются в представлении:

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

enter image description here

Однако, похоже, у него есть некоторые ограничения:

  • Добавление новых строк и/или столбцов на месте может привести к несогласованности в стилизованном представлении (без добавления меток строк/столбцов):

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

enter image description here

который выглядит хорошо, но:

C

enter image description here

  • Форматирование работает только для значений, а не записей индекса:

    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

Ответ 4

Подобно unutbu выше, вы также можете использовать applymap следующим образом:

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)

Ответ 5

Мне нравится использовать pandas.apply() с форматом 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)

Кроме того, его можно легко использовать с несколькими столбцами...

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

Резюме:


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