Як відобразити пандами DataFrame з плавцями за допомогою рядка формату для стовпців?


166

Я хотів би відобразити фрейм даних панди з заданим форматом за допомогою 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

Я розумію, що як тільки $ додається, тип даних автоматично змінюється на об'єкт.
Nguai al

Відповіді:


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

але це працює лише в тому випадку, якщо ви хочете, щоб кожен поплавок був відформатований знаком долара.

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

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

3
Це рішення як і раніше працює для мене належним чином щодо панд 0,22.
Тейлор Едмістон

19
як показано, наприклад, тут , ви можете змінити параметри лише для заданого блоку, використовуючиwith pd.option_context('display.float_format', '${:,.2f}'.format'):
Andre Holzner

1
Додатково 'перед заключними дужками на коментар @AndreHolzner; інакше це працює як шарм!
dTanMan

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
Чи можливо змусити форматер працювати над багаторівневою колоною?
користувач2579685

3
AFAICT, цей приклад працює без другого рядкаpd.options.display.float_format = '${:,.2f}'.format
фортепіаноJames

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 від інтерпретатора?
Джмс

23

Як і унутбу вище, ви також можете використовувати 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)

Мені подобається використовувати цей підхід перед тим, як дзвонити, df.to_csv()щоб переконатися, що всі стовпці мого .csvфайлу мають однакову "цифру ширини". Дякую!
jeschwar

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)

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
    """
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.