我有每天导出到HTML的数据透视表
我用来创建它的代码是
HEADER = '''
.df tbody tr:last-child { background-color: #FF0000; }
'''
FOOTER = '''
'''
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创建逻辑,以使列不出现在数据透视表中,而是确定单位的数据透视单元格的颜色。换句话说,如果我比较前一天的今天的数据透视图,甚至是它的前一个Dataframe(以“单位”为单位),而今天的“数据单元”较小,那么我希望HTML中的CELL为“ RED”而不是黑色。我不知道是否可以将HTML设为红色,而不是基于“单位”值,而是基于相关正/负值来比较同一GROUP的“单位”值。这是创建上面的PIVOT表的数据框
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'])
解决方案
您可以使用np.where(condition, ifConditionTrue, ifConditionFalse)numpy进行更新,pivot1['units']具体取决于与存储前一天单位的另一列(或系列)进行比较,并.map()使用ANSI颜色代码为输出着色,例如:
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颜色代码。
但是,这将使您的“单位”整数值引入字符串,因此无法进行天之间的比较,除非您将其转换回整数–因此,这不是在主数据帧上使用的最佳策略。我建议以另一个名称重新生成它以进行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)))
您可以重复此策略以为更高,不变或特定的值添加更多颜色。