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

Jas*_*n S 135 python ipython dataframe python-2.7 pandas

我想使用print()和IPython 显示具有给定格式的pandas数据帧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
Run Code Online (Sandbox Code Playgroud)

我想以某种方式强迫这种印刷

         cost
foo   $123.46
bar   $234.57
baz   $345.68
quux  $456.79
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

unu*_*tbu 234

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)
Run Code Online (Sandbox Code Playgroud)

产量

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79
Run Code Online (Sandbox Code Playgroud)

但这只有在你希望每个浮点数都用美元符号格式化时才有效.

否则,如果您只想要一些浮点数的美元格式,那么我认为您必须预先修改数据帧(将这些浮点数转换为字符串):

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)
Run Code Online (Sandbox Code Playgroud)

产量

         cost       foo
foo   $123.46  123.4567
bar   $234.57  234.5678
baz   $345.68  345.6789
quux  $456.79  456.7890
Run Code Online (Sandbox Code Playgroud)

  • 如[here](/sf/answers/2148434501/)所示,您可以使用`with pd.option_context('display.float_format','$ {)修改给定块的选项. :,2F} '格式'):` (10认同)
  • @AndreHolzner 的评论的右括号前有额外的 ''` ;否则,它就像一个魅力! (5认同)
  • 这个解决方案对我来说仍然适用于大熊猫0.22. (3认同)
  • 此解决方案在Pandas 0.14中不起作用. (2认同)

小智 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})
Run Code Online (Sandbox Code Playgroud)

产量

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79
Run Code Online (Sandbox Code Playgroud)

  • 是否可以让格式化程序在多级列上工作? (3认同)
  • AFAICT,此示例不使用第二行`pd.options.display.float_format ='$ {:,。2f}'。format` (2认同)

Jas*_*n S 48

从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
Run Code Online (Sandbox Code Playgroud)

哪个显示

在此输入图像描述

这是一个视图对象; DataFrame本身不会更改格式,但DataFrame中的更新会反映在视图中:

constants.name = ['pie','eek']
C
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是它似乎有一些限制:

  • 在原地添加新行和/或列似乎会导致样式视图不一致(不添加行/列标签):

    constants.loc[2] = dict(name='bogus', value=123.456)
    constants['comment'] = ['fee','fie','fo']
    constants
    
    Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

看起来不错但是:

C
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 格式化仅适用于值,而不适用于索引条目:

    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
    
    Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 我可以在解释器内部使用 DataFrame.style 吗? (2认同)

dat*_*ude 19

如果您不想永久更改显示格式,并且可能稍后应用新格式,我个人更喜欢使用资源管理器(withPython 中的声明)。在你的情况下,你可以这样做:

with pd.option_context('display.float_format', '${:0.2f}'.format):
   print(df)
Run Code Online (Sandbox Code Playgroud)

如果您的代码中碰巧需要不同的格式,您可以通过仅改变上面代码片段中的格式来更改它。


sed*_*deh 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)
Run Code Online (Sandbox Code Playgroud)


rod*_*ira 11

您可以使用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
Run Code Online (Sandbox Code Playgroud)

解释

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


Sel*_*lah 7

我喜欢将 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)
Run Code Online (Sandbox Code Playgroud)

此外,它可以很容易地与多列一起使用......

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)
Run Code Online (Sandbox Code Playgroud)


nev*_*ves 6

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

with pd.option_context('display.float_format', '${:,.2f}'.format):
    display(df)
Run Code Online (Sandbox Code Playgroud)

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