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

如何编写Pandas函数高亮DataFrame中职级与薪级的新旧差异

问题:如何用Pandas同时高亮新旧职级、薪级的差异?

我正在用Pandas的DataFrame对比员工数据,原始数据是系统导出的Excel文件。已经筛选出薪资相关列,合并了新旧两周的数据,让旧数据和新数据相邻排列。

现在需要写一个函数,对比4列:Old_Grade vs New_Grade、Old_Step vs New_Step。只要任意一组列的值不相等,就高亮对应的单元格,方便快速识别变动。

我之前用lambda函数单独处理某一组差异是可行的:

colored_changes1 = merged_changes.style.apply(lambda x: (x != merged_changes['Old_Grade']).map({True: 'background-color: yellow', False: ''}),subset=['New_Grade']) 

但尝试添加另一组的lambda函数时出现Styler错误。

另外写了一个自定义函数,运行报错提示DataFrame退化为Series,因为只返回单个值:

def highlight_differences(merged_changes, Old_Grade, New_Grade):
   
    def highlight_diff(value):
        if value[Old_Grade] != value[New_Grade]:
            return 'background-color: yellow'
        else:
            return ''

    return merged_changes.style.apply(highlight_diff, axis=1)


highlighted_df = highlight_differences(merged_changes, 'Old_Grade', 'New_Grade')
highlighted_df.to_excel('highlighted_differences.xlsx', index=False)

请问能不能写一个函数,同时对比职级和薪级的差异并高亮变动位置?


解决方案

可以通过两种方式实现同时高亮两组列的差异:

方法1:使用apply结合样式DataFrame(推荐)

这种方式精准控制要高亮的列,即使DataFrame有其他列也不受影响:

import pandas as pd

def highlight_changes(df):
    # 创建空样式DataFrame,默认无样式
    style_df = pd.DataFrame('', index=df.index, columns=df.columns)
    
    # 标记职级差异:高亮Old_Grade和New_Grade中不相等的行对应单元格
    grade_diff_mask = df['Old_Grade'] != df['New_Grade']
    style_df.loc[grade_diff_mask, ['Old_Grade', 'New_Grade']] = 'background-color: yellow'
    
    # 标记薪级差异:高亮Old_Step和New_Step中不相等的行对应单元格
    step_diff_mask = df['Old_Step'] != df['New_Step']
    style_df.loc[step_diff_mask, ['Old_Step', 'New_Step']] = 'background-color: yellow'
    
    return style_df

# 应用样式并导出到Excel
highlighted_df = merged_changes.style.apply(highlight_changes, axis=None)
highlighted_df.to_excel('highlighted_differences.xlsx', index=False)

方法2:改进行级自定义函数

之前的错误是因为apply(axis=1)要求返回与列数匹配的样式列表,而非单个值。调整后:

def highlight_row_diffs(row):
    styles = []
    # 处理职级列
    if row['Old_Grade'] != row['New_Grade']:
        styles.extend(['background-color: yellow', 'background-color: yellow'])
    else:
        styles.extend(['', ''])
    # 处理薪级列
    if row['Old_Step'] != row['New_Step']:
        styles.extend(['background-color: yellow', 'background-color: yellow'])
    else:
        styles.extend(['', ''])
    # 若DataFrame有其他列,需对应添加空样式''
    return styles

# 应用样式(注意:需确保返回的styles长度与DataFrame列数一致)
highlighted_df = merged_changes.style.apply(highlight_row_diffs, axis=1)
highlighted_df.to_excel('highlighted_differences.xlsx', index=False)

关键说明

  • 方法1灵活性更高,无需关注DataFrame总列数,精准针对目标列处理;
  • 方法2适合列数固定的场景,需保证返回的样式列表长度与列数完全匹配;
  • 两种方法都会将差异单元格高亮为黄色,直观展示职级和薪级的变动。

内容的提问来源于stack exchange,提问作者NKME

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:50:06