2017-12-14 8 views
3

私は別の列の値に依存して表のセルを色付けしようとしています。条件を使用してパンダスタイリング

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 

たとえば、上記のdfでは、c> bの場合は、赤色に着色します。したがって、セルdf [0、b]は強調表示されますが、他のセルは表示されません。

私は複数の試みをしたが、一般的に、私が持っているもの以下

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

私はdocumentationのいずれかの例を見ないように見えます。しています彼らは一般的に、列内の最大値または最小値、またはdf全体を強調表示するなど、単一の列に対して条件を使用しています。

多分私が望むものは現在できませんか?ドキュメントから:

ラベルベースのスライスは現在のところサポートされていますが、位置情報ではありません。

スタイル・ファンクションでサブセットまたは軸のキーワード引数を使用する場合は、 ファンクションをfunctools.partialにラップし、そのキーワードを部分的に にすることを検討してください。

+0

ええと、なぜあなたが使用している 'x.data' ?それは 'memoryview'オブジェクトを返します... –

答えて

4

設定されたスタイルには、色のDataFrameを返す必要があります。だから、デフォルト値で同じインデックスと列を持つ新しいDFを作成する必要がある - ここbackground-color: redをして、条件によって値を変更:

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

私は本当にこの答えが好きです。スタイリングは難しいかもしれません。あなたは 'c2'が' df1 = ... 'で何をしているのかを詳しく知ることができますか?色をロードしていますか... ...?日付枠として? – MattR

+1

はい、設定されたスタイルに '色のDataFrame 'を返す必要があります。だからデフォルト値(ここでは 'c2')で同じインデックスとカラムを持つ新しい' df'を作成し、条件で値を変更する必要があります。 – jezrael

+1

FYI 'c2 = 'background-color:white''は同じ透明な結果を返す – MattR

関連する問題