问题:如何使用列的格式字符串显示浮点数的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
无需修改数据本身或创建副本,只需更改其显示方式即可。
我怎样才能做到这一点?
回答 0
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)
Yield
        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)
Yield
         cost       foo
foo   $123.46  123.4567
bar   $234.57  234.5678
baz   $345.68  345.6789
quux  $456.79  456.7890
回答 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.to_string(formatters={'cost':'${:,.2f}'.format})
Yield
        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79
回答 2
从Pandas 0.17开始,现在有一个样式系统,该系统实质上使用Python格式字符串提供DataFrame的格式化视图:
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
回答 3
与上面的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)
回答 4
我喜欢将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)
回答 5
您还可以将语言环境设置为您所在的区域,并将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
回答 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
    """
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。






