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

如何删除两DataFrame参考列不匹配行并高亮差异?

解决不同长度DataFrame的对比、过滤与差异高亮问题

步骤1:过滤参考列共有的行

先通过参考列的交集筛选出两个DataFrame都存在的行,让后续对比的数据集行范围一致,解决compare因长度不匹配无法运行的问题。

  • 用intersection提取参考列的共同值
  • 用isin过滤两个DataFrame,得到仅含共有行的版本

示例代码:

import pandas as pd

# 替换为你的实际数据
df1 = pd.DataFrame({'id': [1,2,3,4], 'name': ['Alice','Bob','Charlie','David'], 'score': [85,90,78,92]})
df2 = pd.DataFrame({'id': [2,3,5,6], 'name': ['Bob','Charles','Eve','Frank'], 'score': [90,82,75,88]})

ref_col = 'id'  # 指定你的参考列

# 获取参考列的共同值
common_vals = df1[ref_col].intersection(df2[ref_col])

# 过滤出共有行并对齐索引
df1_common = df1[df1[ref_col].isin(common_vals)].set_index(ref_col).sort_index()
df2_common = df2[df2[ref_col].isin(common_vals)].set_index(ref_col).sort_index()

步骤2:生成对比结果

现在两个过滤后的DataFrame行数一致、索引对齐,可选择两种方式生成对比结果:

方式A:合并显示(直观对比两边数据)

用merge合并,添加后缀区分原数据集,方便同时查看两边的完整值:

merged_df = pd.merge(df1_common.reset_index(), df2_common.reset_index(), on=ref_col, suffixes=('_df1', '_df2'))

方式B:用compare仅显示差异

索引对齐后可正常使用compare,直接输出差异部分:

diff_df = df1_common.compare(df2_common, keep_equal=False)

步骤3:高亮差异单元格

针对合并后的DataFrame,自定义样式函数高亮差异:

def highlight_diff(row):
    styles = ['']  # 参考列不需要高亮
    for col in df1_common.columns:
        # 对比对应列的两个版本
        if row[f'{col}_df1'] != row[f'{col}_df2']:
            styles.append('background-color: #ffebee')
            styles.append('background-color: #ffebee')
        else:
            styles.append('')
            styles.append('')
    return styles

# 应用样式(Jupyter环境直接运行即可看到高亮效果)
styled_result = merged_df.style.apply(highlight_diff, axis=1)
styled_result

如果用compare生成的差异表,可直接用内置样式高亮:

styled_diff = diff_df.style.highlight_null(null_color='#ffebee')
styled_diff

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:42:25