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