将某些浮动数据框列格式化为“熊猫”中的百分比

我试图在 IPython 笔记本上写一篇论文,但是遇到了一些显示格式的问题。假设我有以下数据帧 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% 。

235898 次浏览

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

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之前的数字来更改所显示的小数位数。

另外,我不确定你的“百分比”数字是否已经被乘以100。如果他们那么清楚你会想要改变小数的数目显示,并删除百乘。

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

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

使用“{ : .2% }”代替“{ : .2 f }%”-前者将0.41% (正确)转换为41.00% (正确) ,后者将转换为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))

Update

至于熊猫0.17.1,生活变得更轻松了,我们可以马上得到一个漂亮的 html 表:

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

As suggested by @linqu you should not change your data for presentation. Since pandas 0.17.1, (conditional) formatting was made easier. Quoting the documentation:

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

For your example, that would be (the usual table will show up in Jupyter):

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

作为公认答案的一种类似方法,可能会被认为更具可读性、优雅和通用性(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))

Performance-wise, this is pretty close (marginally slower) than the OP solution.

顺便说一句,如果您选择使用 pd.options.display.float_format路由,请考虑使用上下文管理器来处理每个 平行数的例子的状态。

只是另一种方式做到这一点,如果你 需要在更大的范围内进行栏目

使用应用程序映射

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

如果需要在多个列上应用函数,appymap 非常有用; 它实际上是这个特定示例下面的缩写:

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

Great explanation below of apply, map applymap:

大熊猫地图、应用地图和应用方法的差异

通常情况下,我们对计算全部有效数字感兴趣,但是 for the visual aesthetics, we may want to see only few decimal point when we display the dataframe.

在木星笔记本中,熊猫可以利用 HTML 格式化的方法称为 style的优势。

对于只看到某些列的两个有效数字的情况,我们可以使用下面的代码片段:

给定数据框架

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%

更新

如果找不到 display 命令,请尝试以下操作:

from IPython.display import display


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


display(df_style)

Requirements

  • 要使用 display命令,您需要在计算机中安装 Ipython。
  • 在没有安装 IPyton(如 https://repl.it/languages/python3)的在线 python 解释器中,display命令不起作用
  • Display 命令可以在 jupyter-book、 jupyter-lab、 Google-colab、 kaggle-kernel、 IBM-Watson、 Mode-Analytics 和许多其他开箱即用的平台上运行,你甚至不需要从 IPython.display 导入 display

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

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

The list comprehension has an assured result, I'm using it successfully 我认为你可以使用如下列表内涵:

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'] ]

谢谢