如何编写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
相关产品推荐
相关产品推荐

