如何根据单元格值设置Pandas DataFrame整行背景色
问题与解决方案
问题
想依据列表中的UUID值设置DataFrame整行背景色,当前使用applymap方法仅能高亮匹配条件的单个单元格,需要修改代码实现整行着色。
原代码
import numpy as np import pandas as pd item_added = ["UUID1", "UUID22"] item_removed = ["UUID2", "UUID89"] item_changed = ["UUID3", "UUID100"] def highlight_cells_condition(val): if val in item_added: color = "green" elif val in item_removed: color = "red" elif val in item_changed: color = "yellow" else: color = "" return ["background-color: {}".format(color)] arr = np.array( [ ("UUID3", "TYPE1", 0, "AA", "time1", "Items"), ("UUID2", "TYPE2", 0, "BB", "time2", "Items"), ("UUID1", "TYPE1", 1, "CC", "time3", "Vaalves"), ] ) header = ["UUID", "B", "C", "D", "E", "F"] df = pd.DataFrame(num, columns=header) df.style.applymap(highlight_cells_condition) html = style.to_html() with open("output.html","w+") as fh: fh.write(html)
修改后的代码(实现整行高亮)
import numpy as np import pandas as pd item_added = ["UUID1", "UUID22"] item_removed = ["UUID2", "UUID89"] item_changed = ["UUID3", "UUID100"] def highlight_row_condition(row): # 取当前行的UUID值判断对应颜色 uuid_val = row['UUID'] if uuid_val in item_added: color = "green" elif uuid_val in item_removed: color = "red" elif uuid_val in item_changed: color = "yellow" else: color = "" # 生成整行的样式列表,确保每个单元格都应用相同背景色 return [f"background-color: {color}"] * len(row) arr = np.array( [ ("UUID3", "TYPE1", 0, "AA", "time1", "Items"), ("UUID2", "TYPE2", 0, "BB", "time2", "Items"), ("UUID1", "TYPE1", 1, "CC", "time3", "Vaalves"), ] ) header = ["UUID", "B", "C", "D", "E", "F"] df = pd.DataFrame(arr, columns=header) # 使用apply方法按行处理,axis=1指定逐行应用函数 style = df.style.apply(highlight_row_condition, axis=1) html = style.to_html() with open("output.html","w+") as fh: fh.write(html)
关键修改点
- 替换处理方法:把逐单元格处理的
applymap换成按行处理的apply,配合axis=1参数实现逐行判断。 - 重写高亮函数:新函数接收整行数据,通过
row['UUID']获取当前行的UUID值,判断后生成与行长度一致的样式列表,保证整行单元格都应用相同背景色。 - 修正原代码错误:创建DataFrame时变量名从
num改为arr,同时将样式对象赋值给style变量,避免后续调用报错。
内容的提问来源于stack exchange,提问作者user2678648
相关产品推荐
相关产品推荐

