Pandas 样式:基于列表字典的字符串数据
Pandas Styling: string data based on dictionary of lists
我正在尝试为一个非常大的数据框设计样式,其中包含许多不同的单元格填充和字体颜色组合。我尝试使用 lambda 函数,但似乎是一种非常低效的样式设置方式。我正在寻找类似于 post 底部显示的示例的解决方案,标记为 "Desired Approach"。
我的具体案例涉及列表字典。这是一个示例数据集...我想给所有男性名字 blue/orange 和所有女性名字 pink/red 上色:
# 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)
此代码returns以下:
我不明白为什么你有第二个带有名称和旋转列的数据框。
让我使用你的第一个数据框和字典。
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)
输出将如下所示:
能够使用所需的方法解决问题:
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)
我正在尝试为一个非常大的数据框设计样式,其中包含许多不同的单元格填充和字体颜色组合。我尝试使用 lambda 函数,但似乎是一种非常低效的样式设置方式。我正在寻找类似于 post 底部显示的示例的解决方案,标记为 "Desired Approach"。
我的具体案例涉及列表字典。这是一个示例数据集...我想给所有男性名字 blue/orange 和所有女性名字 pink/red 上色:
# 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)
此代码returns以下:
我不明白为什么你有第二个带有名称和旋转列的数据框。
让我使用你的第一个数据框和字典。
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)
输出将如下所示:
能够使用所需的方法解决问题:
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)