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

How to display pandas DataFrame of floats using a format string for columns?

我想使用print()和ipython display()显示给定格式的熊猫数据帧。例如:

1
2
3
4
5
6
7
8
9
10
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

我想用某种方法把这个印出来

1
2
3
4
5
         cost
foo   $123.46
bar   $234.57
baz   $345.68
quux  $456.79

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

我该怎么做?


1
2
3
4
5
6
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)

产量

1
2
3
4
5
        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79

但这只在您希望每个浮动都用美元符号格式化时才有效。

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

1
2
3
4
5
6
7
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)

产量

1
2
3
4
5
         cost       foo
foo   $123.46  123.4567
bar   $234.57  234.5678
baz   $345.68  345.6789
quux  $456.79  456.7890


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

1
2
3
4
5
6
7
8
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})

产量

1
2
3
4
5
        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79


从pandas 0.17开始,现在有了一个样式系统,它基本上使用python格式字符串提供数据帧的格式化视图:

1
2
3
4
5
6
7
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

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

1
2
constants.name = ['pie','eek']
C

氧化镁

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

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

    1
    2
    3
    constants.loc[2] = dict(name='bogus', value=123.456)
    constants['comment'] = ['fee','fie','fo']
    constants

氧化镁

看起来不错,但是:

1
C

氧化镁

  • 格式化仅适用于值,不适用于索引项:

    1
    2
    3
    4
    5
    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

氧化镁


与上述unutbu类似,您也可以使用applymap,如下所示:

1
2
3
4
5
6
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)


我喜欢在python格式()中使用pandas.apply()。

1
2
3
4
5
import pandas as pd
s = pd.Series([1.357, 1.489, 2.333333])

make_float = lambda x:"${:,.2f}".format(x)
s.apply(make_float)

此外,它还可以很容易地用于多个列…

1
2
3
4
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)


总结:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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
   """