質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

546閲覧

pythonでデータフレームに条件に合わせセルを色分けしたい

Bodaishin

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/22 16:27

前提

python-docxに、pythonからデータフレームを取り込むところまではできました。
5行あったとき、その表の各列に、数字の1から5が入力されているとして
1=青、2=赤、3=紫…というように、数字条件にあった、色を付けたいです。
それも、列1と列2では、(1,2,3,4,5)の配列がバラバラである場合、
どうすれば、良いでしょうか。

実現したいこと

発生している問題・

エクセルで、読み込んだ表の2列分(そこを例えば、達成率1,達成率2のような異なるデータが入っている)に対して、色分けしたいのですが、1列分しかできません。
1つの列に色をつける基準として、列のそれぞれの数字の四分位数を取り、そこで、
4つのカテゴリーに分け、色分けをしようとしています。
確かにエラーはでないのですが、1回目は、達成率1の列に対して
色分けされますが、2回目まわした段階で、達成率2の列は白に戻り。
あらたに、達成率2の列が色分けされます。
これを2列に対して、同時に、色分けできなでしょうか?

エラーメッセージ

エラーメッセージは出ないので、文法的には正しいと思うのですが、 ただ、結果は私の意図とは別のもので、明らかにおかしいです。

該当のソースコード

■1回目 (達成率1の列に対して、色分けを行う)
df_test=pd.read_excel('/content/drive/My Drive/20221120test.xlsx')
m1=df_test.loc[0:8,'達成率1'].quantile(q=[0.0, 0.25, 0.5, 0.75, 1.0])

m1=df1_sinchoku.loc[0:8,'達成率1'].quantile(q=[0.0, 0.25, 0.5, 0.75, 1.0])
print(m1)

結果を色で識別する
def color_background_lightgreen(val):

color = 'lightgreen' if val > 0.75 else ( 'cyan' if val < 0.7 else '') #0.75より大なら薄緑、0.6より小さいなら赤、その他は白
color = 'dodgerblue' if val > m1[0.75] else ( 'lightskyblue' if val <= m1[0.75] and val > m1[0.5] else ('plum' if val <= m1[0.5] and val > m1[0.25] else ('deeppink'if val <=m1[0.25] and val>=m1[0.0] else '' ))) #1より大なら薄緑、0.75~1なら水色、0.75以下は赤
return 'background-color: %s' % color

表示
df1_style = df_test.style.applymap(color_background_lightgreen, subset=['達成率1'])

■2回目 (達成率2の列に対して、色分けを行う)

達成率2の列も色塗り
m2=df_test.loc[0:8,'達成率2'].quantile(q=[0, 0.25, 0.5, 0.75, 1])

結果を色で識別する
def color_background_lightgreen(val):

color = 'lightgreen' if val > 0.75 else ( 'cyan' if val < 0.7 else '') #0.75より大なら薄緑、0.6より小さいなら赤、その他は白
color = 'dodgerblue' if val > m2[0.75] else ( 'lightskyblue' if val <= m2[0.75] and val > m2[0.5] else ('plum' if val <= m2[0.5] and val > m2[0.25] else ('deeppink'if val <=m2[0.25] and val>=m2[0] else '' ))) #1より大なら薄緑、0.75~1なら水色、0.75以下は赤
return 'background-color: %s' % color

表示
df2_style = df_test.style.applymap(color_background_lightgreen, subset=['達成率2'])

python

試したこと

df1_style = df_test.style.applymap(color_background_lightgreen, subset=['達成率1','達成率2'])
として、動かしました。
確かに、これで、エラーもでず、出力されたのですが、
両方とも同じ尺度で、色つけされています。

達成率1と、達成率2の四分位範囲の基準が同じであれば、
良いと思うのですが、今は、別な基準となっています。
なので、当然のことながら、色分けの基準は同じではないです。
〇目標達成率:m1
〇新人目標達成率:m2

補足情報(FW/ツールのバージョンなど)

今回の質問は、特にエラーが出る分けではないのですが、
やりたいことがきちんとできない、不整合が起こっています。

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

1回目と2回目で、同じ Styler オブジェクトに applymap する必要があります。(重ねがけするイメージ)

python

1#■1回目 (達成率1の列に対して、色分けを行う) 2df_style = df_test.style.applymap(color_background_lightgreen, subset=['達成率1']) 3 4#■2回目 (達成率2の列に対して、色分けを行う) 5df_style = df_style.applymap(color_background_lightgreen, subset=['達成率2'])

メソッドチェーンでも書けます。(関数名は別にする)

python

1df_style = (df_test.style 2 .applymap(color_background_lightgreen1, subset=['達成率1']) 3 .applymap(color_background_lightgreen2, subset=['達成率2']))

投稿2022/11/23 11:10

bsdfan

総合スコア4560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bodaishin

2022/11/23 23:52

上手くいきました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問