我想使用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
无需修改数据本身或创建副本,只需更改数据的显示方式。
我该怎么做呢?
我喜欢使用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)
从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
您还可以将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)
收益率
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
我喜欢使用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)