我想使用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
无需修改数据本身或创建副本,只需更改数据的显示方式。
我该怎么做呢?
而不是和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是一个可调用对象,它接收指定列的每个值,并且必须返回一个字符串,表示格式化后的值。这只会影响数据帧的呈现,而不会改变底层数据。
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
您还可以将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
如果不想修改数据帧,可以为该列使用自定义格式化器。
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)