python颜色整个pandas数据帧行基于列值

时间:2017-07-17 17:27:33

标签: html css python-3.x pandas dataframe

我有一个下载.csv的脚本并进行一些操作,然后使用df.to_html以漂亮的html格式通过电子邮件发送熊猫数据帧。

我想通过根据特定列中的文本值突出显示或着色不同的行来增强这些表。

我尝试使用pandas styler,但似乎无法使用to_html将其转换为html。我得到一个“AttributeError:'str'对象没有属性'to_html”

还有另一种方法吗?

举一个例子,我可以说我的DF看起来如下,我想突出显示每个制造商的所有行。即为福特,雪佛兰和道奇使用三种不同的颜色:

Year      Color       Manufacturer
2011      Red         Ford
2010      Yellow      Ford
2000      Blue        Chevy
1983      Orange      Dodge

我注意到我可以将格式化程序传递给to_html但看起来它无法通过着色来完成我想要完成的工作?我希望能够做到这样的事情:

def colorred():
    return ['background-color: red']

def color_row(value):
    if value is "Ford":
        result = colorred()
        return result

df1.to_html("test.html", escape=False, formatters={"Manufacturer": color_row})

1 个答案:

答案 0 :(得分:0)

令人惊讶的是,回头看它从来没有得到回答我不相信to_html格式化器甚至可以做到这一点。经过多次重访后,我找到了一个非常好的解决方案,我很满意。我没有看到任何接近这个在线的东西,所以我希望这有助于其他人。

d = {'Year' : [2011, 2010, 2000, 1983],
    'Color' : ['Red', 'Yellow', 'Blue', 'Orange'],
    'Manufacturer' : ['Ford', 'Ford', 'Chevy', 'Dodge']}
df =pd.DataFrame(d)
print (df)

def color_rows(s):
    df = s.copy()

    #Key:Value dictionary of Column Name:Color
    color_map = {}

    #Unqiue Column values
    manufacturers = df['Manufacturer'].unique()
    colors_to_use = ['background-color: #ABB2B9', 'background-color: #EDBB99', 'background-color: #ABEBC6', 
              'background-color: #AED6F1']

    #Loop over our column values and associate one color to each
    for manufacturer in manufacturers:
        color_map[manufacturer] = colors_to_use[0]
        colors_to_use.pop(0)

    for index, row in df.iterrows():
        if row['Manufacturer'] in manufacturers:
            manufacturer = row['Manufacturer']
            #Get the color to use based on this rows Manufacturers value
            my_color = color_map[manufacturer]
            #Update the row using loc
            df.loc[index,:] = my_color
        else:
            df.loc[index,:] = 'background-color: '        
    return df

df.style.apply(color_rows, axis=None)

输出:

Pandas row coloring

由于我没有在这里嵌入图像的信誉,我是如何通过电子邮件发送它的。我用以下内容将其转换为html。

styled = df.style.apply(color_rows, axis=None).set_table_styles(
                        [{'selector': '.row_heading',
                          'props': [('display', 'none')]},
                         {'selector': '.blank.level0',
                          'props': [('display', 'none')]}])
html = (styled.render())