将pandas中的某些浮动数据框列格式化为百分比
我正在尝试在IPython笔记本中写一篇论文,但遇到了一些显示格式的问题。比如我有一个数据表 df
,有没有办法把 var1
和 var2
格式化为两位小数,而 var3
格式化为百分比呢?
var1 var2 var3
id
0 1.458315 1.500092 -0.005709
1 1.576704 1.608445 -0.005122
2 1.629253 1.652577 -0.004754
3 1.669331 1.685456 -0.003525
4 1.705139 1.712096 -0.003134
5 1.740447 1.741961 -0.001223
6 1.775980 1.770801 -0.001723
7 1.812037 1.799327 -0.002013
8 1.853130 1.822982 -0.001396
9 1.943985 1.868401 0.005732
这里面的数字并不是乘以100的,比如 -0.0057 实际上是 -0.57%。
12 个回答
正如@linqu所建议的,你不应该为了展示而改变你的数据。从pandas 0.17.1版本开始,(条件)格式化变得更简单了。引用一下文档:
你可以通过使用
DataFrame.style
属性来应用条件格式化,也就是根据数据内容来给DataFrame
进行视觉样式的设置。这个属性会返回一个pandas.Styler
对象,它有一些很有用的方法可以用来格式化和展示DataFrames
。
对于你的例子,代码如下(在Jupyter中会显示出常规的表格):
df.style.format({
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format,
})
我们经常想要计算完整的有效数字,但为了让显示效果更好,有时候我们只想在数据表中看到几个小数点。
在jupyter-notebook中,pandas可以利用一种叫做style
的方法来使用html格式。
如果我们只想看到某些列的两个有效数字,可以使用下面的代码片段:
给定的数据表
import numpy as np
import pandas as pd
df = pd.DataFrame({'var1': [1.458315, 1.576704, 1.629253, 1.6693310000000001, 1.705139, 1.740447, 1.77598, 1.812037, 1.85313, 1.9439849999999999],
'var2': [1.500092, 1.6084450000000001, 1.652577, 1.685456, 1.7120959999999998, 1.741961, 1.7708009999999998, 1.7993270000000001, 1.8229819999999999, 1.8684009999999998],
'var3': [-0.0057090000000000005, -0.005122, -0.0047539999999999995, -0.003525, -0.003134, -0.0012230000000000001, -0.0017230000000000001, -0.002013, -0.001396, 0.005732]})
print(df)
var1 var2 var3
0 1.458315 1.500092 -0.005709
1 1.576704 1.608445 -0.005122
2 1.629253 1.652577 -0.004754
3 1.669331 1.685456 -0.003525
4 1.705139 1.712096 -0.003134
5 1.740447 1.741961 -0.001223
6 1.775980 1.770801 -0.001723
7 1.812037 1.799327 -0.002013
8 1.853130 1.822982 -0.001396
9 1.943985 1.868401 0.005732
样式以获得所需格式
df.style.format({'var1': "{:.2f}",'var2': "{:.2f}",'var3': "{:.2%}"})
结果是:
var1 var2 var3
id
0 1.46 1.50 -0.57%
1 1.58 1.61 -0.51%
2 1.63 1.65 -0.48%
3 1.67 1.69 -0.35%
4 1.71 1.71 -0.31%
5 1.74 1.74 -0.12%
6 1.78 1.77 -0.17%
7 1.81 1.80 -0.20%
8 1.85 1.82 -0.14%
9 1.94 1.87 0.57%
更新
如果找不到显示命令,可以尝试以下方法:
from IPython.display import display
df_style = df.style.format({'var1': "{:.2f}",'var2': "{:.2f}",'var3': "{:.2%}"})
display(df_style)
要求
- 要使用
display
命令,你需要在你的电脑上安装Ipython。 - 在没有安装
IPython
的在线python解释器中,display
命令是无法使用的,比如https://repl.it/languages/python3。 - 在jupyter-notebook、jupyter-lab、Google-colab、kaggle-kernels、IBM-watson、Mode-Analytics等许多平台上,
display
命令可以直接使用,你甚至不需要从IPython.display导入它。
你还可以设置浮点数的默认格式:
pd.options.display.float_format = '{:.2%}'.format
使用 '{:.2%}' 代替 '{:.2f}%' - 前者会把 0.41 转换成 41.00%(这是正确的),而后者会把 0.41 转换成 0.41%(这是错误的)
被接受的回答建议为了展示效果去修改原始数据,这通常是不太好的做法。想象一下,如果你还需要对这些列进行进一步分析,而你在四舍五入时失去了精确度,那就麻烦了。
你可以在数据框中单独修改列的格式,在你的情况下:
output = df.to_string(formatters={
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format
})
print(output)
顺便提一下,'{:,.2%}'.format(0.214)
的结果是 21.40%
,所以不需要再乘以100了。
这样你就没有漂亮的HTML表格了,而是变成了文本表示。如果你想保持HTML格式,可以使用 to_html
函数。
from IPython.core.display import display, HTML
output = df.to_html(formatters={
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format
})
display(HTML(output))
更新
从pandas 0.17.1版本开始,事情变得简单多了,我们可以直接得到一个漂亮的HTML表格:
df.style.format({
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format,
})
使用四舍五入函数来替换数值,并格式化百分比数字的字符串表示:
df['var2'] = pd.Series([round(val, 2) for val in df['var2']], index = df.index)
df['var3'] = pd.Series(["{0:.2f}%".format(val * 100) for val in df['var3']], index = df.index)
四舍五入函数可以把一个小数四舍五入到你指定的小数位数,这个位数是作为函数的第二个参数传入的。
字符串格式化让你可以按照自己的想法来显示数字。你可以通过改变f
前面的数字来调整显示的小数位数。
补充说明:我不确定你的“百分比”数字是否已经乘以100了。如果已经乘过了,那你就需要调整显示的小数位数,并去掉乘以100的部分。