【问题标题】:Pandas dataframe to_html cell alignment熊猫数据框 to_html 单元格对齐
【发布时间】:2016-01-28 18:21:45
【问题描述】:

我有一个如下所示的 Pandas 数据框:

    X     Y        Z
  abc   0.2     -1.5
  efg   0.8     -1.4

我想使用 to_html() 方法从中生成一个 HTML,但我想让 X 列左对齐,Y 列和 Z 列右对齐。另外,我想让负浮点数显示为(1.5)和(1.4),并将这些的字体颜色设置为红色。看起来 to_html() 中有一个格式化程序选项,似乎我可以用括号显示负数,但我不知道如何在这种条件下设置对齐方式和字体颜色。

任何帮助将不胜感激。

【问题讨论】:

  • 您能发布到目前为止您尝试过的内容吗?
  • 当然。我可以通过以下方式获得用括号显示的负数: formatter = lambda x: '({:,.0f})'.format(fabs(x)) if x
  • 您可能无法使用to_html 执行此操作。有一个open PR 正在处理这将更加灵活。应该进入下一个版本。
  • 可以轻松完成。在这里查看我的解决方案。 Align text in Pandas column

标签: python html pandas formatting conditional


【解决方案1】:

我一直在研究同样的正确理由问题。这似乎是一个已知问题(见上面@TomAugspurger 的评论)。我使用您的解决方案来显示带括号的负数,并且能够获得正确的理由来工作。但是,有一个问题。您需要为正数添加前导和尾随特殊字符才能完成这项工作。

首先,找出你想要右对齐的最长浮点数中有多少有效数字。

import pandas as pd
import numpy as np

#Create pandas dataframe who's values are floats of varying length
df = pd.DataFrame(np.random.randn(10, 2), columns=['Y', 'Z']) * 10000

#Determine the length of the longest float
y = len(str(max(abs(df.Y))))
z = len(str(max(abs(df.Z))))
if y > z:
    print(y)
else:
    print(z)

我不确定为什么 df.to_html(float_format = lambda x: '{:f}'.format(x) 不会右对齐结果,因为浮点数默认为右对齐。

我还尝试通过添加前导空格来使函数右对齐,使每个浮点数具有最小长度,因此它们将在右侧对齐df.to_html(float_format = lambda x: '{:20f}'.format(x),但在转换为时省略了前导空格html for x

我发现您可以强制在 html 输出中为有效数字较少的浮点数显示前导空格的唯一方法是在浮点值周围使用特殊字符并将浮点数的有效数字格式指定为至少 1长于实际最长值。在下面的代码块中,我将浮点长度设置为至少 20 个字符,但可以将其限制为最大值(我们之前打印的)加 1。

#Convert df to html using '(x)' to denote -x and '+x+' to denote +x and right justify
df.to_html(float_format = lambda x: '({:20f})'.format(abs(x)) if x < 0 else '+{:20f}+'.format(abs(x)))

我欢迎使用更优雅的方式来做到这一点。

  • Windows 7 64 位
  • Python 3.5.2
  • 熊猫 0.18.1
  • Numpy 1.11.1

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 2022-01-12
    • 2023-03-11
    • 2021-08-16
    • 2021-04-02
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多