尝试为dataframe的单元格着色,然后将其转储为html并尝试保留单元格样式时出现形状错误

2024-10-01 04:50:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,其中包含6列多行。在我的情况下,理想情况下,c3中的值应与c5中的值匹配,c4与c6中的值匹配。如果不是较小的,则该单元格中的文本应以红色突出显示

C1,C2,C3,C4,C5,C6
a,b,21,200,21,200
c,d,1050,1900,1050,1900
k,l,250,1300,250,1330
j,m,230,1400,228,1339
s,t,210,1900,220,1900

现在,我使用panda.read_csv读取此文件,并使用.to_html函数将其转换为html文件。但理想情况下,我也应该将值为1300的C4列着色为红色,因为它小于第3行中的C6值1330。类似地,颜色228和1339,因为对于第4行,C5和C6分别小于C3和C4

我试着做的基本上是首先将_csv读取到熊猫数据帧,然后使用df.style.apply(fnToColorRed,axis=1),在fnToColorRed内部我试着给它上色,但它不起作用

def fnToColorRed(value):
    color= red if ( value['C2'] != value['C4'] or value['C3'] != value['C5'] ) else black
    return 'color %s ' %color

csv_file_df=pd.read_csv("my.csv")
style=csv_file_df.style.apply(fnToColorRed,axis=1)
df_html=style.render() 
df_html.to_html('my.html')

但上述措施似乎并不奏效。事实上,我在第行得到了以下错误:df_html=style.render(),该函数返回了错误的形状。ValueError:函数fnToColorRed返回了错误的形状。结果有形状:(5,)期望形状:(5,6)

请注意,如果创建的html文件满足上述代码中提到的条件color= red if ( value['C2'] != value['C4'] or value['C3'] != value['C5'] ) else black,则希望它的单元格颜色保留为红色

谢谢


Tags: 文件csvdfvaluestylehtml情况color
2条回答

您可以通过自定义函数创建样式的DataFrame,该函数具有比较列,并首先在^{}中设置这些列,然后传递到^{},最后使用file.write函数写入文件:

def fnToColorRed(x):
    c1 = 'color: red'
    c2 = 'color: black' 

    # condition
    m = x[['C3','C4']].to_numpy() != x[['C5','C6']].to_numpy()
    #print (m)
    #empty DataFrame of styles
    df1 = pd.DataFrame('', index=x.index, columns=x.columns)
    #set new columns by condition
    df1[['C3','C4']] = np.where(m, c1, c2)
    df1[['C5','C6']] = np.where(m, c1, c2)
    return df1

然后可以指定一些css:

css = [
{
       'props': [
           ('border-collapse', 'collapse')]
},       
{
       'selector': 'th',
       'props': [
           ('border-color', 'black'),
           ('border-style ', 'solid'),
           ('border-width','1px')]
},
{ 
       'selector': 'td',
       'props': [
           ('border-color', 'black'),
           ('border-style ', 'solid'),
           ('border-width','1px')]
}]

style=df.style.apply(fnToColorRed, axis=None).set_table_styles(css)

with open("my.html", "w") as file:
    file.write(style.render())
    

如果使用axis=1,则希望返回完整的颜色行。因此,请尝试:

def fnToColorRed(value):
    color0 = 'black'
    color1 = 'black'
    color2 = 'red' if value['C3'] < value['C5'] else 'black'
    color3 = 'red' if value['C4'] < value['C6'] else 'black'
    color4 = 'red' if value['C5'] < value['C3'] else 'black'
    color5 = 'red' if value['C6'] < value['C4'] else 'black'
    return ['color %s ' % color0, 'color %s ' % color1, 'color %s ' % color2, 'color %s ' % color3, 'color %s ' % color4, 'color %s ' % color5]

相关问题 更多 >