如何使用字符串格式来显示浮点数的 pandas 数据帧?

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

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

我该怎么做呢?

493081 次浏览
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

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

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

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

熊猫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

它显示

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

which looks ok but:

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

我喜欢使用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)

简介:


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

您还可以将locale设置为您的地区,并将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

如果你不想永久地改变显示格式,也许以后会应用一种新的格式,我个人倾向于使用资源管理器(Python中的with语句)。在你的例子中,你可以这样做:

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

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

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

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

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

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