如何基于Pandas DataFrame中另一列元素为指定列设置样式?
Pandas 按对应分数列给字母列设置背景色
问题场景
现有如下示例Pandas DataFrame:
import pandas as pd # Sample DataFrame data = { 'Greek letters': ["Alpha", "Beta", "Gamma", "Omega", "Delta"], 'English letters': ["A", "B", "C", "D", "E"], 'Greek Letter score': [5, 10, 15, 20, 25], 'English Letter score': [3, 11, 12, 18, 25] } df = pd.DataFrame(data)
需求是:根据Greek Letter score和English Letter score列的分数,分别给Greek letters和English letters列的元素设置对应背景色:
- 分数≤10:浅绿背景
- 10<分数≤20:黄色背景
- 分数>20:蓝色背景
原有的applymap方法只能获取单个单元格的值,无法关联到同一行的对应分数列,因此需要调整实现方式。
解决方案
使用style.apply方法并指定axis=1按行处理,这样可以访问整行数据,从而匹配对应列的分数值并设置样式。
完整实现代码
import pandas as pd # 示例DataFrame data = { 'Greek letters': ["Alpha", "Beta", "Gamma", "Omega", "Delta"], 'English letters': ["A", "B", "C", "D", "E"], 'Greek Letter score': [5, 10, 15, 20, 25], 'English Letter score': [3, 11, 12, 18, 25] } df = pd.DataFrame(data) def highlight_row(row): # 初始化样式列表,默认无样式 styles = [''] * len(row) # 建立字母列与对应分数列的映射关系 col_score_mapping = { 'Greek letters': 'Greek Letter score', 'English letters': 'English Letter score' } # 遍历需要设置样式的列 for col_name, score_col_name in col_score_mapping.items(): # 获取当前列在行中的索引位置 col_index = row.index.get_loc(col_name) # 获取对应分数值 score = row[score_col_name] # 根据分数设置背景色 if score <= 10: styles[col_index] = 'background-color: lightgreen' elif score <= 20: styles[col_index] = 'background-color: yellow' else: styles[col_index] = 'background-color: blue' return styles # 应用样式,axis=1表示按行处理 styled_df = df.style.apply(highlight_row, axis=1) # 在Jupyter环境中直接运行可显示样式表格,本地可通过styled_df.to_html('styled_table.html')保存为HTML查看 styled_df
代码说明
- 按行处理:
style.apply(..., axis=1)会将每一行数据传入highlight_row函数,因此可以直接访问该行的所有列数据。 - 列映射:通过
col_score_mapping字典建立字母列与分数列的对应关系,让代码更易维护,新增列时只需修改该字典。 - 样式赋值:初始化一个与行长度相同的空样式列表,根据分数判断结果为对应位置的单元格设置背景色样式。
效果说明
运行代码后,Greek letters和English letters列的元素会根据各自对应分数列的值,显示对应的背景色,与预期效果一致。
内容的提问来源于stack exchange,提问作者Diamoniner12345
相关产品推荐
相关产品推荐

