Python:如何根据行sale_hours与列小时条件为DataFrame值标黄
需求说明
现有如下销售计划DataFrame表格:
| item | sale_hours | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
item1 | [1-2] | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.2 | 0.2 | 0.2 | 0.3 | 0.3 | 0.3 | 0.3 |
item2 | [11-2] | 0.4 | 0.5 | 0.4 | 0.5 | 0.5 | 0.4 | 0.3 | 0.3 | 0.3 | 0.4 | 0.5 | 0.4 | 0.5 |
item3 | [6-7][10-1] | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.1 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 |
需要实现:根据列对应的小时(0-12)与每行sale_hours字段指定的范围,若列小时处于该范围,则将对应单元格标黄高亮。
技术解决方案
以下是基于Python Pandas的实现步骤:
1. 解析sale_hours字段,生成高亮小时列表
定义解析函数,处理单个区间、多个区间、跨天区间(如[11-2]代表11、12、0、1、2):
import re import pandas as pd def parse_sale_hours(hours_str): # 提取所有区间字符串 ranges = re.findall(r'\[(\d+-\d+)\]', hours_str) highlight_hours = set() for r in ranges: start, end = map(int, r.split('-')) if start <= end: # 正常连续区间,如1-2:包含1、2 highlight_hours.update(range(start, end + 1)) else: # 跨天区间,如11-2:包含11、12、0、1、2 highlight_hours.update(range(start, 13)) highlight_hours.update(range(0, end + 1)) return highlight_hours
2. 创建样式函数,应用高亮规则
遍历每个单元格,判断当前列小时是否在该行的高亮列表中,符合条件则添加黄色背景样式:
def highlight_sale_hours(row): highlight_hours = parse_sale_hours(row['sale_hours']) styles = [] for col in row.index: if col in ['item', 'sale_hours']: styles.append('') else: hour = int(col) styles.append('background-color: yellow' if hour in highlight_hours else '') return styles
3. 应用样式到DataFrame
假设你的DataFrame名为sale_plan,执行以下代码生成带高亮的表格:
# 按行应用样式 styled_df = sale_plan.style.apply(highlight_sale_hours, axis=1) # 直接显示表格(Jupyter环境中)或导出为HTML styled_df
补充说明
- 支持所有示例中的区间格式,包括多区间组合。
- 若需导出结果,可使用
styled_df.to_html('highlighted_sale_plan.html')保存为HTML文件。
内容的提问来源于stack exchange,提问作者Herry
相关产品推荐
相关产品推荐

