pandas

【pandas】applymapで一定条件を満たす列にのみ色を付ける

この記事は約3分で読めます。

 

データ準備

 

import pandas as pd 
df = pd.DataFrame({'商品ID':[1, 2, 3, 4, 5], '商品名': ["水", "炭酸水", "コーヒー", "コーラ", "ポカリ"], '平均価格': [200, 120, 250, 300, 260]})
df

 

<実行結果>

商品ID 商品名 平均価格
0 1 水 300
1 2 炭酸水 120
2 3 コーヒー 350
3 4 コーラー 300
4 6 コーラーゼロ 560

 

applymapで一定条件を満たす列にのみ色を付ける

 

# 一定の数値以上を部分に色を付ける
def color_negative_red(val):
   """ Takes a scalar and returns a string with the css property `
   'color: red'` for negative strings, black otherwise. """ 
   color = 'red' if val > 200 else 'black' 
   return 'color: %s' % color
df[['平均価格']].style.applymap(color_negative_red)

 

引数valの値に対して、200以上なら文字色を赤、それ以外は黒の色にするCSSの文字列を返しています。上で定義した関数をdf.style.applymap(関数)に入れてやれば、データフレームの全ての値に対して関数処理が行われます。

 

<実行結果>

 

よくあるエラー一覧

 

Styler object has no attribute style

 

上記の関数(style.applymap)を適用して色を付けると「pandas.io.formats.style.Styler」というdataframeとは違う別のデータ型になるので、データフレームで出来ていたメソッドが使用できなくなり上記のようなエラーが発生します。なので色付け処理は最後の最後で行った方が良いでしょう

 

‘Series’ object has no attribute ‘style’

 

applymapはデータフレームにしか適用できません。df[‘列名’].style.applymapだとエラーになります。こういった場合はsubset=[“列名A”,“列名B”]みたいな感じで関数を適用する列を指定してください

 

<イメージ例>

df.style.applymap(color_negative_red, subset=["B","C","D","E"])

 

 

‘>’ not supported between instances of ‘str’ and ‘int’

 

色付けするデータフレームに数値以外が含まれていると発生します。色付けしようとしている列に数値以外のデータが混じっていないか確認してみてください。上記のようにsubset=[“列名A”,“列名B”]みたいな感じで関数を適用する列を絞ってください。

 

終わり

 

MENTAで相談を受けたので調べてみましたが、個人的にはエクセルでできることなので多分エクセルでやった方が手っ取り早いと思います。

 

参照:https://chayarokurokuro.hatenablog.com/entry/2021/02/25/175922

 

コメント

タイトルとURLをコピーしました