如何基于同Key列的两个Pandas DataFrame匹配值设置条件格式?
解决Pandas DataFrame匹配单元格高亮问题
问题说明
现有两个Pandas DataFrame:df_diff和df_all,二者共享Key列,其余列名不同。需要遍历df_diff的每一行,通过Key在df_all中找到对应行,检查df_diff该行的每个单元格值是否存在于df_all对应行的任意单元格中,匹配的单元格设置红色背景。
示例数据
import pandas as pd # 构造示例df_diff df_diff = pd.DataFrame({ 'Key': ['Key2', 'Key3', 'Key4'], 'Column_1': ['Value2', 'Value3', 'Value5'], 'Column 2': ['Value3', 'Value4', 'Value6'] }) # 构造示例df_all df_all = pd.DataFrame({ 'Key': ['Key2', 'Key3', 'Key6'], 'Column_all_A': ['Value8', 'Value3', 'Value0'], 'Column_all_B': ['Value2', 'Value10', 'Value11'] })
解决方案代码
# 将df_diff转换为Key对应值列表的字典,方便快速查询 diff_key_values = df_diff.set_index('Key').apply(lambda row: row.tolist(), axis=1).to_dict() # 定义高亮函数:匹配则设置红色背景 def highlight_match(cell_value, row_key): if row_key in diff_key_values and cell_value in diff_key_values[row_key]: return 'background-color: red' return '' # 对df_all应用样式,按行遍历每个单元格 styled_result = df_all.style.apply( lambda row: [highlight_match(val, row['Key']) for val in row], axis=1 ) # 查看结果(Jupyter环境直接运行即可显示,或导出为HTML) styled_result
代码逻辑说明
- 预处理匹配数据:把
df_diff转换成以Key为键、对应行所有非Key列值的列表为值的字典,避免每次遍历都重复查询,提升效率。 - 定义高亮规则:
highlight_match函数接收单元格值和该行的Key,判断值是否在对应Key的匹配列表中,符合条件则返回红色背景样式。 - 应用样式到df_all:通过
style.apply按行处理df_all,每行的每个单元格都调用高亮函数生成对应的样式。
运行后,df_all中Key2的Column_all_B、Key3的Column_all_A会被标记红色背景,符合预期需求。
内容的提问来源于stack exchange,提问作者NeuroNaut
相关产品推荐
相关产品推荐

