[英]Format certain floating dataframe columns into percentage in pandas
我正在尝试在 IPython notebook 中写一篇论文,但遇到了一些显示格式的问题。 假设我关注 dataframe df
,有没有办法将var1
和var2
格式化为 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正如@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的很好的解释:
作为与公认答案类似的方法,可能被认为更具可读性、优雅和通用性 (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.