2017-07-17 81 views
0

我有一个脚本,下载一个.csv并执行一些操作,然后使用df.to_html以良好的html格式发送熊猫数据框。基于列值的python颜色整个熊猫dataframe行

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

我试过使用熊猫styler似乎工作,但我不能转换为HTML使用to_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}) 

回答

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()) 
+0

显然我没有信誉嵌入图像,所以你必须按照链接看到Jupyter呈现的图像 – Micmizer