繁体   English   中英

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

[英]Format certain floating dataframe columns into percentage in pandas

我正在尝试在 IPython notebook 中写一篇论文,但遇到了一些显示格式的问题。 假设我关注 dataframe df ,有没有办法将var1var2格式化为 2 位小数,将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%。

接受的答案建议修改原始数据以用于演示目的,这是您通常不想要的。 想象一下,您需要对这些列进行进一步分析,并且需要舍入时丢失的精度。

您可以修改数据框中各个列的格式,在您的情况下:

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

您还可以为 float 设置默认格式:

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

使用 '{:.2%}' 而不是 '{:.2f}%' - 前者将 0.41 转换为 41.00%(正确),后者转换为 0.41%(错误)

使用 round 函数替换值,并格式化百分比数字的字符串表示形式:

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)

round 函数将浮点数四舍五入到作为函数第二个参数提供的小数位数。

字符串格式允许您根据需要表示数字。 您可以通过更改f之前的数字来更改显示的小数位数。

ps 我不确定您的“百分比”数字是否已经乘以 100。如果已经乘以 100,那么您将想要更改显示的小数位数,并删除百倍乘法。

很多时候我们对计算完整的有效数字感兴趣,但为了视觉美感,当我们显示数据框时,我们可能只想看到几个小数点。

在 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。
  • display命令在没有安装IPyton在线 Python 解释器中IPyton例如https://repl.it/languages/python3
  • display 命令适用于 jupyter-notebook、jupyter-lab、Google-colab、kaggle-kernels、IBM-watson、Mode-Analytics 和许多其他开箱即用的平台,您甚至不必从 IPython.display 导入 display

正如@linqu 所建议的,您不应更改用于演示的数据。 从 pandas 0.17.1 开始,(条件)格式化变得更容易了。 引用文档

您可以使用DataFrame.style属性应用条件格式,即根据其中的数据应用DataFrame的视觉样式。 这是一个返回pandas.Styler对象的属性,该对象具有用于格式化和显示DataFrames有用方法。

对于您的示例,这将是(通常的表将显示在 Jupyter 中):

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

如果您需要在更大范围的上执行此操作,这是另一种方法

使用应用映射

df[['var1','var2']] = df[['var1','var2']].applymap("{0:.2f}".format)
df['var3'] = df['var3'].applymap(lambda x: "{0:.2f}%".format(x*100))

如果您需要将函数应用于多列,applymap 很有用; 对于此特定示例,它本质上是以下内容的缩写:

df[['var1','var2']].apply(lambda x: map(lambda x:'{:.2f}%'.format(x),x),axis=1)

下面对apply、mapapplymap的很好的解释:

Pandas 中 map、applymap 和 apply 方法的区别

作为与公认答案类似的方法,可能被认为更具可读性、优雅和通用性 (YMMV),您可以利用map方法:

# OP example
df['var3'].map(lambda n: '{:,.2%}'.format(n))

# also works on a series
series_example.map(lambda n: '{:,.2%}'.format(n))

在性能方面,这与 OP 解决方案非常接近(略慢)。

pd.options.display.float_format ,如果您确实选择使用pd.options.display.float_format路线,请考虑使用上下文管理器来处理每个并行 numpy 示例的状态

style.format是矢量化的,所以我们可以简单地将它应用到整个df (或只是它的数字列):

df[num_cols].style.format('{:,.3f}')

列表理解有一个确定的结果,我使用它成功我想你可以使用 python 列表理解如下:

df['var1'] = ["{:.2f}".format(i) for i in df['var1'] ]
df['var2'] = ["{:.2f}".format(i) for i in df['var2'] ]
df['var3'] = ["{:.2%}".format(i) for i in df['var3'] ]

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM