Python. Создать колонку в dataframe в которой будут цвета, исходя из значений в других колонках

Цвет задается следующими правилам:

  • внутри одной области цвета словосочетаний в одном кластере должны быть одинаковые, в разных - отличаться
  • цвета кластеров в разных областях могут повторяться
  • у одной области [area] слова из "Кластер 1" могут быть красного цвета, в другой области у слов из "Кластер 1" может быть другой цвет
df = pd.DataFrame([[1,1],[2,2],[3,3],[4,4],[1,5],[2,6],[3,7],[4,8]],
         columns=['area','cluster'])

Вопрос 1: хочу присвоить цвета каждой из колонок отдельно, а потом из 2ух колонок цвета слепить в одну, как сделать более оптимально?

Вопрос 2: Есть ли способ присвоить цифрам цвета без долго перечисления if-elif, с помощью matplotlib.colors


Ответы (1 шт):

Автор решения: strawdog

Насколько я понял ваш вопрос, все сводится к обычному маппингу номеров областей и кластеров в цвета.

Это можно сделать так (для областей. для кластеров - аналогично):

from matplotlib import colors
color_list = list(colors.BASE_COLORS.keys())
df["area_color"] = df["area"].apply(lambda x: color_list[x])
   area  cluster area_color
0     1        1          g
1     2        2          r
2     3        3          c
3     4        4          m
4     1        5          g
5     2        6          r
6     3        7          c
7     4        8          m

либо, с другой схемой:

color_list = list(colors.CSS4_COLORS.keys())
df["area_color"] = df["area"].apply(lambda x: color_list[x*10])
   area  cluster  area_color
0     1        1  blueviolet
1     2        2        cyan
2     3        3  darkorange
3     4        4    deeppink
4     1        5  blueviolet
5     2        6        cyan
6     3        7  darkorange
7     4        8    deeppink

остается не совсем понятным, что вы имели в виду под "слепить в одну"

UPDATE

если нужно выставить соответствия цветов не целым числам, а строкам, можно сделать так:

при df:

   area cluster
0     1       a
1     2       b
2     3       c
3     4       d
4     1       e
5     2       f
6     3       g
7     4       h
from matplotlib import colors
color_list = list(colors.CSS4_COLORS.keys())
df["cluster_color"] = [color_list[x*10] for x in pd.factorize(df["cluster"])[0]]

получаете df:

   area cluster         cluster_color
0     1       a             aliceblue
1     2       b            blueviolet
2     3       c                  cyan
3     4       d            darkorange
4     1       e              deeppink
5     2       f            ghostwhite
6     3       g                indigo
7     4       h  lightgoldenrodyellow
→ Ссылка