Как отобразить панды DataFrame с плавающей запятой, используя строку формата для столбцов?

166

Я хотел бы отобразить pandas dataframe с использованием заданного формата 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

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

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

Джейсон С
источник
2
Это costединственный столбец с плавающей запятой, или есть другие столбцы с плавающей запятой, которые не должны быть отформатированы $?
unutbu
Я хотел бы сделать это только для столбца затрат (в моих реальных данных есть другие столбцы)
Jason S
я понимаю, что после присоединения $ тип данных автоматически меняется на объект.
Нгуай Аль

Ответы:

284
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

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

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

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
unutbu
источник
3
Это решение все еще работает правильно для меня с панды 0,22.
Тейлор Эдмистон
19
как показано здесь , например , вы можете изменять параметры только для данного блока, используяwith pd.option_context('display.float_format', '${:,.2f}'.format'):
Andre Holzner
1
Дополнительно 'перед закрывающей скобкой на комментарии @AndreHolzner; в противном случае это работает как шарм!
ДанМан
67

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

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
Крис Мур
источник
2
Можно ли заставить работать форматтер на многоуровневом столбце?
user2579685 21.09.15
3
AFAICT, этот пример работает без второй строкиpd.options.display.float_format = '${:,.2f}'.format
pianoJames
56

Начиная с 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

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

введите описание изображения здесь

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

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

введите описание изображения здесь

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

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

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

введите описание изображения здесь

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

C

введите описание изображения здесь

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

    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

введите описание изображения здесь

Джейсон С
источник
2
Могу ли я использовать DataFrame.style внутри интерпретатора?
Jms
23

Как и в случае с 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)
sedeh
источник
Мне нравится использовать этот подход перед вызовом, df.to_csv()чтобы убедиться, что все столбцы в моем .csvфайле имеют одинаковую «ширину цифры». Спасибо!
Иешвар
5

Мне нравится использовать pandas.apply () с python format ().

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)
Села
источник
2

Вы также можете установить локаль для своего региона и установить float_format для использования формата валюты. Это автоматически установит знак $ для валюты в США.

import locale

locale.setlocale(locale.LC_ALL, "en_US.UTF-8")

pd.set_option("float_format", locale.currency)

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
Влад Безден
источник
0

резюме:


    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
    """
Carson
источник