Pandas多DataFrame重复行高亮时索引覆盖问题求助
问题根源
你写的highlight_yellow函数依赖全局变量rows,处理第二个DataFrame时,rows会被重新赋值成第二个表的重复行索引,导致第一个DataFrame的样式应用时用了新的rows值,高亮结果自然出错。
解决办法
把需要高亮的索引列表作为参数传给高亮函数,别用全局变量,让每个表的高亮逻辑各自独立。
修正后的完整代码:
import pandas as pd import numpy as np # 生成第一个DataFrame colA = list(range(1,6)) colB = ['aa', 'bb', 'aa', 'cc', 'aa'] colC = [14,3,14,9,12] colD = [108, 2001, 152, 696, 696] df = pd.DataFrame(list(zip(colA, colB, colC, colD)), columns =['colA', 'colB', 'colC', 'colD']) print(df) # 生成第二个DataFrame colA = list(range(1,7)) colB = [208, np.nan ,201, 150, 900, 670] colC = ['aa', np.nan ,'bb', 'aa', 'cc', 'bb'] df2 = pd.DataFrame(list(zip(colA, colB, colC)), columns =['colA', 'colB', 'colC']) print(df2) # 修改高亮函数,接收需要高亮的索引列表作为参数 def highlight_yellow(x, highlight_rows): return ['background-color: yellow' if x.name in highlight_rows else '' for i in x] # 处理第一个表的高亮 row_series = df['colB'].dropna(how = 'any').duplicated(keep = False) highlight_rows_df = row_series[row_series].index.values df_styled = df.style.apply(highlight_yellow, axis = 1, highlight_rows=highlight_rows_df) # 处理第二个表的高亮 row_series = df2['colC'].dropna(how = 'any').duplicated(keep = False) highlight_rows_df2 = row_series[row_series].index.values df2_styled = df2.style.apply(highlight_yellow, axis = 1, highlight_rows=highlight_rows_df2) # 导出到Excel,两个表分不同工作表 with pd.ExcelWriter('highlighted_data.xlsx') as writer: df_styled.to_excel(writer, sheet_name='Sheet1', index=False) df2_styled.to_excel(writer, sheet_name='Sheet2', index=False)
关键说明
- 重构后的
highlight_yellow函数通过参数接收当前表的高亮索引,不再依赖全局变量,避免了覆盖问题。 - 每个DataFrame单独计算自己的高亮索引列表,应用样式时传入对应参数,确保各自的高亮逻辑互不干扰。
- 新增了Excel导出代码,直接把两个带样式的表导出到同一个文件的不同工作表里,方便查看最终效果。
内容的提问来源于stack exchange,提问作者youaresoconfused
相关产品推荐
相关产品推荐

