PANDAS TO_HTML条件格式化

时间:2016-12-15 17:41:59

标签: python html pandas

我有一个每日数据透视表,我导出为HTML

enter image description here

我用来创建它的代码是

HEADER = '''
<html>
    <head>
        <style>
            .df tbody tr:last-child { background-color: #FF0000; }
        </style>
    </head>
    <body>
'''
FOOTER = '''
    </body>
</html>
'''

with open("/home/testing_libs/htmlex.html", 'w') as f:
    f.write(HEADER)
    f.write(pivot1.to_html(classes='pivot1'))
    f.write(FOOTER)

源是PANDAs数据帧。我想用PANDA创建逻辑,以使列不显示在数据透视表中,但确定单位的数据透视表单元格的颜色。换句话说,如果我比较今天的Pivot,或者甚至是它的前身Dataframe,就前一天的'单位',以及当天的'单位'都比较小,那么我希望那个CELL的HTML'RED'而不是黑色。 我不知道我是否可以根据NOT“单位”值得到HTML红色,但是相关的正/负值比较相同的GROUP的“单位”值。 以下是创建上述PIVOT TABLE

的数据框
    widget  region  industry    units
0   oldschool   middle  tech    10
1   newschool   west    manufacturing   40
2   upandcomer  east    manufacturing   50
3   oldschool   west    manufacturing   40
4   newschool   east    manufacturing   30
5   upandcomer  middle  manufacturing   20
6   oldschool   middle  manufacturing   10
7   newschool   east    tech    30
8   upandcomer  east    tech    30

然后创建PIVOT

pivot1 = pd.pivot_table(frame1,index=['region','widget','industry'])

1 个答案:

答案 0 :(得分:1)

您可以使用numpy中的np.where(condition, ifConditionTrue, ifConditionFalse)来更新pivot1['units'],具体取决于您存储前一天的单位和.map()的其他列(或系列)的比较输出ANSI colour codes,例如:

pivot1['units'] = np.where( (pivot1['units'] < pivot0['units']), (pivot1['units'] = pivot1['units'].map(lambda x: "\x1b[41m"+str(x)+"\x1b[m")), (pivot1['units'].map(lambda x: str(x)))

其中pivot1是当前日期的数据框,pivot0是前一天的数据框,奇怪的前缀和后缀是红色黑色文字的ANSI颜色代码背景

然而,这将使您的单位&#39;整数值介绍字符串,因此可以在几天之间进行比较,除非您将它们转换回整数 - 因此这不是在主数据帧上使用的最佳策略。我建议使用不同的名称为HTML导出重新生成它。

pivot1_export = pivot1
pivot1_export['units'] = np.where( (pivot1['units'] < pivot0['units']), (pivot1_export['units'] = pivot1['units'].map(lambda x: "\x1b[41m"+str(x)+"\x1b[m")), (pivot1_export['units'].map(lambda x: str(x)))

您可以重复此策略,为更高,未更改或特定值添加更多颜色。