Pandas数据帧to_html单元格对齐

时间:2015-10-28 19:41:28

标签: python html pandas formatting conditional

我有一个看起来像这样的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()中有一个格式化程序选项,似乎我可以用括号显示负数,但我无法弄清楚如何用这种条件设置对齐和字体颜色。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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< 20位有效数字(或者您在格式化语句中指定的数字)。

我发现你可以强制在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
  • Pandas 0.18.1
  • Numpy 1.11.1