Как отобразить 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
"""