如何优化Pandas DataFrame条件格式化代码,适配动态列?
解决方案
1. 统一管理参考值映射
先把分散的参考值变量整理成列名-参考值的字典,直接和DataFrame的列对应,从根源解决动态适配问题:
import numpy as np import pandas as pd # 构建目标DataFrame df = pd.DataFrame({'patient': {0: 'Mark', 1: 'Susan', 2: 'Andy', 3: 'Paula'}, 'blood pressure': {0: 45, 1: 36, 2: 35, 3: 92}, 'heart rate': {0: 60, 1: 65, 2: 98, 3: 59}, 'pulse': {0: 70, 1: 70, 2: 45, 3: 76}, 'weight': {0: 150, 1: 180, 2: 200, 3: 210}, 'height': {0: 178, 1: 170, 2: 165, 3: 168}, 'oxygen': {0: 92, 1: 99, 2: 96, 3: 97}}) # 列名与参考值的映射字典 ref_values = { 'blood pressure': 36, 'heart rate': 70, 'pulse': 60, 'weight': 180, 'height': np.nan, 'oxygen': 96 } # 无关变量cholesterol直接忽略即可
2. 编写通用高亮函数
写一个复用性强的函数,接收单列数据和对应参考值,返回每个单元格的样式规则(可按需调整高亮逻辑):
def highlight_column(col): # 获取当前列的参考值,无对应值则返回空样式 ref = ref_values.get(col.name, None) if pd.isna(ref): return [''] * len(col) # 定义高亮规则:低于参考值红背景,高于绿背景,等于无样式 styles = [] for val in col: if val < ref: styles.append('background-color: #ffcccc') elif val > ref: styles.append('background-color: #ccffcc') else: styles.append('') return styles
3. 统一应用样式
用Styler.apply()按列批量处理,自动筛选数值列,新增列只需在ref_values中添加对应条目即可自动适配,不存在的列直接跳过:
# 仅对数值列应用样式,排除非数值列(如patient) styled_df = df.style.apply(highlight_column, subset=df.select_dtypes(include=['int64', 'float64']).columns) # Jupyter环境直接运行显示,本地可导出为HTML保存 styled_df
核心优势
- 消除冗余:无需多次调用
applymap,一次操作处理所有目标列 - 动态适配:新增列时仅需补充
ref_values;列不存在时自动跳过,不会触发报错 - 易于维护:高亮规则可在
highlight_column中统一修改,无需逐个调整列逻辑
内容的提问来源于stack exchange,提问作者Steve..Johnson
相关产品推荐
相关产品推荐

