我想使用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

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

我该怎么做呢?


当前回答

简介:


    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
    """

其他回答

如果不想修改数据帧,可以为该列使用自定义格式化器。

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

而不是和pd搅在一起。选项和全局影响你的数据帧的渲染,你可以使用datafframe .style.format并且只对一个数据帧的渲染设置样式。

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接受一个字典,它的键映射到你想要样式化的列名,value是一个可调用对象,它接收指定列的每个值,并且必须返回一个字符串,表示格式化后的值。这只会影响数据帧的呈现,而不会改变底层数据。

类似于上面的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)

从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

然而,它似乎有一些局限性:

就地添加新行和/或列似乎会导致样式视图不一致(不添加行/列标签): 常量。Loc [2] = dict(name='bogus', value=123.456) 常量['comment'] = ['fee','fie','fo'] 常量

看起来不错,但是:

C

格式化仅适用于值,而不适用于索引项: 常量= pd.DataFrame(((“π”,np.pi)(“e”,np.e)], 列=['名称','价值']) constants.set_index(“名字”,原地= True) C = constants.style。格式({的名字 ': '~~ {} ~~', ' 价值”:“- > {:15.10 f} <——'}) C

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

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

该格式仅对该数据帧的显示有效