2017-07-17 10 views
0

Ich habe ein Skript, das eine .csv herunterlädt und macht einige Manipulation und dann E-Mails Panda-Datenrahmen in einem schönen HTML-Format mit Hilfe von df.to_html.Python Farbe gesamte Pandas Datenrahmen Zeilen basierend auf Spaltenwerte

Ich möchte diese Tabellen durch Hervorhebung oder Färbung verschiedener Zeilen basierend auf ihrem Textwert in einer bestimmten Spalte erweitern.

Ich versuchte mit Pandas styler, die scheint zu funktionieren, aber ich kann das nicht in HTML mit to_html konvertieren. Ich bekomme ein "AttributeError: 'str' Objekt hat kein Attribut 'to_html"

Gibt es eine andere Möglichkeit, dies zu tun?

Als Beispiel lässt sich sagen, mein DF sieht wie folgt aus und ich möchte alle Zeilen für jeden Hersteller hervorheben. d.h Verwenden Sie drei verschiedene Farben für Ford, Chevy und Dodge-:

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

ich bemerkte ich Formatierer in to_html passieren kann, aber es scheint, dass es nicht tun kann, was ich durch Färben zu vollenden möchte? Ich möchte in der Lage sein, etwas zu tun wie:

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}) 

Antwort

0

überrascht, das es nie beantwortet worden ist, wie im Rückblick glaube ich nicht, dies mit to_html Formatierer überhaupt möglich ist. Nach ein paar erneuten Besuchen habe ich eine sehr schöne Lösung gefunden, mit der ich zufrieden bin. Ich habe nichts online gesehen, also hoffe ich, dass dies jemand anderem hilft.

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) 

Ausgang:

Pandas row coloring

Da ich Bilder nicht die cred müssen hier einzubetten ist, wie ich es per E-Mail. Ich konvertiere es in HTML mit den folgenden.

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

Anscheinend habe ich nicht das Cred, um Bilder einzubetten, also müssen Sie dem Link folgen, um das Jupyter gerenderte Bild zu sehen – Micmizer

Verwandte Themen