python-将某些浮动数据框列格式化为熊猫百分比
我正在尝试在IPython笔记本中写论文,但是在显示格式方面遇到了一些问题。 说我有以下数据帧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%。
7个解决方案
87 votes
可接受的答案建议出于演示目的修改原始数据,而您通常不希望这样做。 想象一下,您需要对这些列进行进一步分析,并且需要舍入而失去的精度。
在这种情况下,您可以修改数据框中各个列的格式:
output = df.to_string(formatters={
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format
})
print(output)
供您参考,to_html会产生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))
更新资料
从熊猫0.17.1开始,生活变得更加轻松,我们可以立即获得一个漂亮的html表:
df.style.format({
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format,
})
linqu answered 2020-01-29T11:17:11Z
32 votes
使用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)
舍入函数将浮点数舍入为该函数的第二个参数提供的小数位数。
字符串格式可让您根据需要表示数字。 您可以通过更改f之前的数字来更改显示的小数位数。
ps。 我不确定您的“百分比”数字是否已乘以100。如果清楚了,您将要更改显示的小数位数,并删除百分位数。
Woody Pride answered 2020-01-29T11:16:28Z
28 votes
您还可以设置float的默认格式:
pd.options.display.float_format = '{:.2f}%'.format
Romain Jouin answered 2020-01-29T11:17:30Z
21 votes
按照@linqu的建议,您不应更改要显示的数据。 自熊猫0.17.1起,(条件)格式化变得更加容易。 引用文档:
您可以使用DataFrame.style属性来应用条件格式,即DataFrame的可视样式,具体取决于其中的数据。 此属性返回pandas.Styler对象,该对象具有用于格式化和显示DataFrames的有用方法。
对于您的示例,将是(通常的表将在Jupyter中显示):
df.style.format({
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format,
})
mdeff answered 2020-01-29T11:18:00Z
9 votes
通常,我们有兴趣计算完整的有效数字,但是为了视觉美观,在显示数据框时,我们可能只希望看到小数点。
在jupyter-notebook中,大熊猫可以利用称为style的方法来利用html格式。
对于仅看到某些列的两位有效数字的情况,我们可以使用以下代码段:
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%
Poudel answered 2020-01-29T11:18:33Z
6 votes
这是您需要在更大范围的色谱柱上进行操作的另一种方法
使用applymap
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进行详细说明,将applymap映射:
Pandas中map,applymap和apply方法之间的区别
RK1 answered 2020-01-29T11:19:11Z
1 votes
作为一种可以被认为更易读,优雅且通用的解决方案(YMMV),您可以利用pd.options.display.float_format方法:
# 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路线,请考虑使用上下文管理器来处理此并行numpy示例的状态。
circld answered 2020-01-29T11:19:40Z