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

use*_*212 52 python formatting pandas ipython-notebook

我想在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
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)

  • 比接受的答案要好得多 (4认同)
  • `df.style.format({'var3': '{:,.2%}'})` - 这不起作用。值保持不变,即没有 % (4认同)
  • `.format` 部分不是必需的,您可以省略它们。 (3认同)
  • @zwornik `%` 需要位于 `'{:.2f}%'` 中的括号之外 (3认同)

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.如果他们已经清楚你会想要改变显示的小数位数,并删除百位乘法.

  • 谢谢,这会改变每列中的实际值吗? (2认同)
  • 您还可以设置float的默认格式:pd.options.display.float_format ='{:.2f}%'.format (2认同)

Rom*_*uin 28

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

pd.options.display.float_format = '{:.2f}%'.format
Run Code Online (Sandbox Code Playgroud)

  • 很高兴知道并且与 OP 关于在 python 笔记本中输出的问题相关 (2认同)
  • 如果百分比仍然以小数形式给出(例如,当使用 `df.pct_change()` 时):`pd.options.display.float_format = '{:.2%}'.format` (2认同)

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)

  • 这是行不通的。我使用了与你完全相同的代码 (2认同)

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)


cir*_*cld 6

作为与公认答案类似的方法,可能被认为更具可读性、优雅和通用性 (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 示例的状态


RK1*_*RK1 6

这是您需要在更大范围的色谱柱上进行操作的另一种方法

使用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方法之间的区别


mir*_*phd 6

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

  • 该系列应首先转换为数据帧: df[num_cols].to_frame().style.format('{:,.3f}%') (2认同)