How to display pandas DataFrame of floats using a format string for columns?
我想使用
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 |
哪个显示
。
这是一个视图对象;数据框本身不更改格式,但数据框中的更新反映在视图中:
1 2 | constants.name = ['pie','eek'] C |
。
氧化镁
然而,它似乎有一些局限性:
在样式视图中添加新行和/或列似乎会导致不一致(不添加行/列标签):
1
2
3constants.loc[2] = dict(name='bogus', value=123.456)
constants['comment'] = ['fee','fie','fo']
constants
氧化镁
看起来不错,但是:
1 | C |
。
氧化镁
格式化仅适用于值,不适用于索引项:
1
2
3
4
5constants = 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类似,您也可以使用
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 """ |
号