You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:25:31