2017-12-14 1 views
3

Ich versuche Zellen Zellen abhängig von den Werten in einer anderen Spalte zu färben.Pandas Styling mit Bedingungen

import pandas as pd 
df = pd.DataFrame({'a':[1,2,3],'b':[1.5,3,6],'c':[2.2,2.9,3.5]}) 
df 

    a b c 
0 1 1.5 2.2 
1 2 3.0 2.9 
2 3 6.0 3.5 

Zum Beispiel in den obigen df I b rot gefärbt, wenn c> b will. Also würde die Zelle df [0, b] hervorgehoben sein, aber keine der anderen.

Ich habe mehrere Versuche gemacht, aber im Allgemeinen, was ich habe sieht aus wie die unten

def highlight(val1,val2): 
    color = 'red' if val1 < val2 else 'black' 
    return 'color: %s' % color 

df.style.apply(lambda x: highlight(x.data.b,x.data.c), axis = 1,subset=['b']) 

TypeError: ('memoryview: invalid slice key', 'occurred at index 0') 

Ich habe keine Beispiele in der documentation sehen. Sie verwenden im Allgemeinen Bedingungen für eine einzelne Spalte, z. B. das Hervorheben eines Maximums oder eines Minimums innerhalb einer Spalte oder das gesamte df.

Vielleicht ist das, was ich will, derzeit nicht möglich? Aus der Dokumentation:

Nur Label-basierte Slicing wird jetzt unterstützt, nicht positionsabhängig.

Wenn Ihre Stilfunktion ein Teilmengen- oder Achsenschlüsselwortargument verwendet, erwägen Sie, Ihre Funktion in ein functools.partial zu verpacken, indem Sie dieses Schlüsselwort ausgliedern.

+0

um, warum Sie verwenden 'x.data' ? Das gibt ein 'memoryview'-Objekt zurück ... –

Antwort

4

Sie müssen DataFrame der Farben für festgelegte Stile zurückgeben. Also müssen neue df erstellen mit dem gleichen Index und Spalten mit Standardwerten - hier background-color: red und dann Werte von Zustand ändern:

def highlight(x): 
    c1 = 'background-color: red' 
    c2 = 'background-color: black' 
    #if want set no default colors 
    #c2 = '' 
    m = x['c'] > x['b'] 
    df1 = pd.DataFrame(c2, index=x.index, columns=x.columns) 
    df1.loc[m, 'b'] = c1 
    return df1 

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

one

two

+0

ich mag diese Antwort wirklich. Styling kann schwierig sein. Könntest du tiefer eintauchen in das, was 'c2' in' df1 = ... 'macht? Ladest du ... Farben ...? als Zeitrahmen? – MattR

+1

Ja, Sie müssen 'DataFrame of colors' für festgelegte Stile zurückgeben. Sie müssen also ein neues 'df' mit demselben Index und Spalten mit Standardwerten erstellen - hier' c2' und dann die Werte nach Bedingung ändern. – jezrael

+1

FYI 'c2 = 'background-color: white'' liefert das gleiche transparente Ergebnis – MattR

Verwandte Themen