如何用Pandas Styler为DataFrame最后两行的非0单元格标红
问题描述
我有一个DataFrame,想要对单元格值≠0的特定单元格或行设置格式。我仅关注索引为1和2的最后两行(对应Check列的'ID Check'和'Name Check'),因此仅希望条件与格式应用于这两行。理想情况下,我只想高亮Findings列下的单元格,但高亮整行也可以。
期望的条件逻辑:
当
Check为'ID Check'且Findings≠0,或Check为'Name Check'且Findings≠0时,将目标单元格/整行设为红色,其余情况保持默认样式。
我的DataFrame构建代码如下(已修正拼写和变量错误):
import pandas as pd # 补充缺失的导入 def record_count(): with open('filename.csv', encoding='utf8') as file: record_number = len(list(file)) print("Number of records on file:", record_number) return record_number def user_count(): df = pd.read_csv('filename.csv', low_memory=False) user_number = df['users'].nunique() print("Number of users on file:", str(user_number)) return user_number def id_check(): df = pd.read_csv('filename.csv', low_memory=False) missing_id = df["id"].isna().sum() print("Number of users missing an id:", missing_id) return missing_id def name_check(): df = pd.read_csv('filename.csv', low_memory=False) missing_name = df["name"].isna().sum() print("Number of users missing a name:", missing_name) return missing_name checks_table = { 'Check' : ['Record Check', 'ID Check', 'Name Check'], 'Summary' : ['Number of records on file','Number of records missing an ID', 'Number of users missing a name'], 'Findings' : [record_count(), id_check(), name_check()] } df_checks = pd.DataFrame.from_dict(checks_table) df_checks.head()
解决方案
可以通过Pandas的Styler工具实现条件格式设置,以下是两种场景的实现代码:
场景1:仅高亮Findings列的问题单元格
def highlight_target_cell(row): # 判断当前行是否符合问题条件 has_issue = (row['Check'] in ['ID Check', 'Name Check']) and (row['Findings'] != 0) # 仅对Findings列应用红色背景,其余列保持默认 return [ 'background-color: #ffcccc' if col == 'Findings' and has_issue else '' for col in row.index ] # 仅对索引1-2的行应用样式 styled_df = df_checks.style.apply(highlight_target_cell, axis=1, subset=pd.IndexSlice[1:3, :]) # 显示样式化表格 styled_df
场景2:高亮整行问题行
def highlight_target_row(row): has_issue = (row['Check'] in ['ID Check', 'Name Check']) and (row['Findings'] != 0) # 整行应用浅红色背景 return ['background-color: #ffcccc'] * len(row) if has_issue else [''] * len(row) # 仅对索引1-2的行应用样式 styled_df = df_checks.style.apply(highlight_target_row, axis=1, subset=pd.IndexSlice[1:3, :]) # 显示样式化表格 styled_df
关键说明
subset=pd.IndexSlice[1:3, :]:精准指定只对索引1和2的行(即'ID Check'和'Name Check'所在行)应用样式,避免影响其他行。axis=1:设置按行处理数据,每一行都会调用一次自定义的高亮函数。- CSS样式:使用
background-color: #ffcccc(浅红色)替代纯红色,避免视觉过于刺眼,也可以根据需求改为red。
导出带样式的报告
如果需要将样式化后的表格导出为可查看的文件,可使用以下代码:
# 导出为HTML文件 styled_df.to_html('data_check_report.html') # 导出为Excel文件(需提前安装openpyxl库:pip install openpyxl) styled_df.to_excel('data_check_report.xlsx', engine='openpyxl')
内容的提问来源于stack exchange,提问作者bananas
相关产品推荐
相关产品推荐

