Pandas Styling: строковые данные на основе словаря списков - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь стилизовать очень большой массив данных с множеством различных цветовых комбинаций для заполнения ячейки и шрифта.Я экспериментировал с использованием лямбда-функций, но мне показался очень неэффективным способ стайлинга.Я ищу решение, похожее на пример, показанный внизу поста, с пометкой «Желаемый подход».

Мой конкретный случай включает в себя словарь списков.Вот пример набора данных ... я хотел бы раскрасить все имена мужчин в синий / оранжевый и все имена женщин в розовый / красный:

# raw data
df = pd.DataFrame({'Freshman':['Mike', 'Bill', 'Maria'],
                   'Junior':['Lauren','Tom','Jessica'],
                   'Senior':['Sandy','Michelle','Mike']
                   })

my_dict = {'Male':['Mike','Bill','Tom'],
          'Female':['Maria','Lauren','Jessica','Sandy','Michelle']} 

Желаемый подход:

Я пытался настроить этот подход для своего варианта использования, но не могу заставить его работать.

# raw data
df = pd.DataFrame({'Name':['name1', 'name2', 'name3', 'name1', 'name2', 'name3', 'name1', 'name2', 'name3' ],  
                   'Rotation':['ER','PEDI','MAM','PEDI', 'ERJD','PEDI','JMAM','ERSN','ABD']})

def where(x):
  bg = ['blue', 'pink']
  fg = ['orange', 'red']
  ls = ['ER', 'MAM']
  for i, y in enumerate(ls):
    if y in x:
      return f"background-color: {bg[i]}; color: {fg[i]}"
  return ''

df.style.applymap(where)

этот код возвращает следующее:

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

удалось решить, используя желаемый подход:

def where(val):
  bg = ['blue', 'pink']
  fg = ['orange', 'red']
  ls = ['Male', 'Female']
  for i, y in enumerate(ls):
    if val in my_dict[y]:
      return f"background-color: {bg[i]}; color: {fg[i]}"
  return ''

df = df.style.applymap(where)
0 голосов
/ 20 сентября 2018

Я не понимаю, почему у вас есть второй фрейм данных с именами и столбцами ротации.

Позвольте мне использовать ваш первый фрейм данных и диктанты.

df = pd.DataFrame({'Freshman':['Mike', 'Bill', 'Maria'],
               'Junior':['Lauren','Tom','Jessica'],
               'Senior':['Sandy','Michelle','Mike']
               })

my_dict = {'Male':['Mike','Bill','Tom'],
      'Female':['Maria','Lauren','Jessica','Sandy','Michelle']} 

Итак, вы хотите, чтобы у самцов был синий фон , а текст оранжевый .А у женщин розовый фон и красный цвет текста .

def colorit(val):
    color = 'orange' if val in my_dict['Male'] else 'red'
    bgcolor = 'blue' if val in my_dict['Male'] else 'pink'
    return 'background-color: %s ; color: %s'% (bgcolor,color)

df.style.applymap(colorit)

Вывод будет выглядеть так:

enter image description here

...