0

我正在尝试用许多不同的颜色组合为单元格填充和字体设计一个非常大的数据框。我尝试使用 lambda 函数,但似乎是一种非常低效的造型方式。我正在寻找类似于帖子底部显示的示例的解决方案,标记为“所需的方法”。

我的具体案例涉及列表字典。这是一个示例数据集...我想将所有男性的名字涂成蓝色/橙色,并将所有女性的名字涂成粉红色/红色:

# 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)

此代码返回以下内容:

在此处输入图像描述

4

2 回答 2

0

能够使用所需的方法解决:

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)
于 2018-09-20T01:59:34.077 回答
0

我不明白为什么你有第二个带有名称和旋转列的数据框。

让我使用您的第一个数据框和字典。

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)

输出将如下所示:

在此处输入图像描述

于 2018-09-19T23:40:26.503 回答