将pandas中的某些浮动数据框列格式化为百分比

131 投票
12 回答
292615 浏览
提问于 2025-04-18 08:11

我正在尝试在IPython笔记本中写一篇论文,但遇到了一些显示格式的问题。比如我有一个数据表 df,有没有办法把 var1var2 格式化为两位小数,而 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 个回答

28

正如@linqu所建议的,你不应该为了展示而改变你的数据。从pandas 0.17.1版本开始,(条件)格式化变得更简单了。引用一下文档

你可以通过使用DataFrame.style属性来应用条件格式化,也就是根据数据内容来给DataFrame进行视觉样式的设置。这个属性会返回一个pandas.Styler对象,它有一些很有用的方法可以用来格式化和展示DataFrames

对于你的例子,代码如下(在Jupyter中会显示出常规的表格):

df.style.format({
    'var1': '{:,.2f}'.format,
    'var2': '{:,.2f}'.format,
    'var3': '{:,.2%}'.format,
})
43

我们经常想要计算完整的有效数字,但为了让显示效果更好,有时候我们只想在数据表中看到几个小数点。

在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导入它。
68

你还可以设置浮点数的默认格式:

pd.options.display.float_format = '{:.2%}'.format

使用 '{:.2%}' 代替 '{:.2f}%' - 前者会把 0.41 转换成 41.00%(这是正确的),而后者会把 0.41 转换成 0.41%(这是错误的)

206

被接受的回答建议为了展示效果去修改原始数据,这通常是不太好的做法。想象一下,如果你还需要对这些列进行进一步分析,而你在四舍五入时失去了精确度,那就麻烦了。

你可以在数据框中单独修改列的格式,在你的情况下:

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,
})
49

使用四舍五入函数来替换数值,并格式化百分比数字的字符串表示:

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的部分。

撰写回答