如何删除两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
相关产品推荐
相关产品推荐

