use*_*212 52 python formatting pandas ipython-notebook
我想在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
Run Code Online (Sandbox Code Playgroud)
内部数字不会乘以100,例如-0.0057 = -0.57%.
lin*_*nqu 94
接受的答案建议修改原始数据以用于演示目的,这是您通常不想要的.想象一下,您需要使用这些列进行进一步分析,并且您需要通过舍入来丢失精度.
在您的情况下,您可以修改数据框中各列的格式:
output = df.to_string(formatters={
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format
})
print(output)
Run Code Online (Sandbox Code Playgroud)
为了您的信息'{:,.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))
Run Code Online (Sandbox Code Playgroud)
更新
从熊猫0.17.1开始,生活变得更轻松,我们可以立即获得一个漂亮的html表:
df.style.format({
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format,
})
Run Code Online (Sandbox Code Playgroud)
Woo*_*ide 31
使用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)
Run Code Online (Sandbox Code Playgroud)
round函数将浮点数舍入为函数的第二个参数提供的小数位数.
字符串格式允许您根据需要表示数字.您可以通过更改之前的数字来更改显示的小数位数f
.
ps我不确定你的'百分比'数字是否已经乘以100.如果他们已经清楚你会想要改变显示的小数位数,并删除百位乘法.
Rom*_*uin 28
您还可以设置float的默认格式:
pd.options.display.float_format = '{:.2f}%'.format
Run Code Online (Sandbox Code Playgroud)
mde*_*eff 22
正如@linqu所建议的那样,您不应该更改您的数据以进行演示.由于pandas 0.17.1,(条件)格式化变得更容易.引用文档:
您可以使用属性应用条件格式,即视图中
DataFrame
的数据的视觉样式DataFrame.style
.这是一个返回pandas.Styler
对象的属性,它具有格式化和显示的有用方法DataFrames
.
对于你的例子,那将是(通常的表将显示在Jupyter中):
df.style.format({
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format,
})
Run Code Online (Sandbox Code Playgroud)
Pou*_*del 10
通常,我们对计算完整的有效数字感兴趣,但出于视觉美感,在显示数据框时,我们可能只希望看到很少的小数点。
在jupyter-notebook中,大熊猫可以利用称为的方法来利用html格式style
。
对于仅看到某些列的两位有效数字的情况,我们可以使用以下代码段:
df.style.format({'var1': "{:.2f}",'var2': "{:.2f}",'var3': "{:.2%}"})
Run Code Online (Sandbox Code Playgroud)
给出:
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%
Run Code Online (Sandbox Code Playgroud)
作为与公认答案类似的方法,可能被认为更具可读性、优雅和通用性 (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))
Run Code Online (Sandbox Code Playgroud)
在性能方面,这与 OP 解决方案非常接近(略慢)。
顺便说pd.options.display.float_format
一句,如果您确实选择走这条路线,请考虑使用上下文管理器来处理每个并行 numpy 示例的状态。
这是您需要在更大范围的色谱柱上进行操作的另一种方法
使用applymap
df[['var1','var2']] = df[['var1','var2']].applymap("{0:.2f}".format)
df['var3'] = df['var3'].applymap(lambda x: "{0:.2f}%".format(x*100))
Run Code Online (Sandbox Code Playgroud)
如果需要将函数应用于多个列,applymap很有用;对于此特定示例,它实质上是以下内容的缩写:
df[['var1','var2']].apply(lambda x: map(lambda x:'{:.2f}%'.format(x),x),axis=1)
Run Code Online (Sandbox Code Playgroud)
下面对apply进行详细说明,将applymap映射:
Pandas中map,applymap和apply方法之间的区别
style.format
是矢量化的,所以我们可以简单地将它应用到整个df
(或仅其数字列):
df[num_cols].style.format('{:,.3f}%')
请注意,如果df
仅包含 1 列并且实际上是一个系列,则首先需要转换为pandas DataFrame
,例如使用pd.DataFrame(df[num_col]).style.format
、 或 ,如下所示:df[num_col].to_frame().style.format
。
归档时间: |
|
查看次数: |
74917 次 |
最近记录: |