如何使用列的格式字符串显示浮动的pandas DataFrame?

时间:2014-01-05 18:39:44

标签: python python-2.7 pandas ipython dataframe

我想使用print()和IPython display()显示具有给定格式的pandas数据帧。例如:

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

无需修改数据本身或创建副本,只需更改其显示方式即可。

我该怎么做?

10 个答案:

答案 0 :(得分:206)

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

答案 1 :(得分:62)

如果您不想修改数据框,可以为该列使用自定义格式化程序。

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 :(得分:32)

As of Pandas 0.17 there is now a styling system本质上使用Python format strings提供了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

显示

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

答案 3 :(得分:17)

与上面的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 :(得分:1)

我喜欢将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 :(得分:1)

您还可以将语言环境设置为您所在的区域,并将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 :(得分:1)

如果您不想永久更改显示格式,或者以后再应用新格式,我个人更喜欢使用资源管理器(Python中的with语句)。在您的情况下,您可以执行以下操作:

with pd.option_context('display.float_format', '${:0.2f}'.format):
   print(df)

如果您恰好需要在代码中使用其他格式,则可以通过仅更改上面代码段中的格式来进行更改。

答案 7 :(得分:1)

您可以使用 DataFrame.style.format 并仅设置一个数据帧的渲染样式,而不是弄乱 pd.options 并全局影响数据帧的呈现。

df.style.format({
  'cost': lambda val: f'${val:,.2f}',
})

>>>
>>>            cost
>>> ---------------
>>> foo   $123.4567
>>> bar   $234.5678
>>> baz   $345.6789
>>> quux   $456.789

说明

函数 df.style.format 接受一个 dict,其键映射到您要设置样式的列名,该值是一个可调用对象,它接收指定列的每个值,并且必须返回一个字符串,表示格式化的值。这只影响数据框的渲染,不会改变底层数据。

答案 8 :(得分:1)

现在,我首选的解决方案是使用上下文管理器来显示数据框:

with pd.option_context('display.float_format', '${:,.2f}'.format):
    display(df)

格式仅对显示此数据框有效

答案 9 :(得分: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
    """