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

如何优化Python DataFrame差异稀疏矩阵的展示效果?

解决DataFrame.compare()结果每行仅显示差异列的问题

核心思路

dropna(axis=1, how='all')仅会删除所有行都为空的列,无法实现每行单独保留非空列的需求。我们需要针对每行单独处理,筛选出该行存在差异(非空)的列,再重新组织展示结构。

可行解决方案

方法1:生成结构化差异列表(适合Jupyter展示与后续处理)

# 先执行对比得到差异矩阵
diff = df1.compare(df2)

# 遍历每行提取差异内容
diff_details = []
for row_idx, row_data in diff.iterrows():
    # 筛选当前行非空的列(即有差异的列)
    non_null_entries = row_data.dropna()
    # 按主列整理新旧值
    row_diff = {}
    for (col_name, side), val in non_null_entries.items():
        if col_name not in row_diff:
            row_diff[col_name] = {}
        row_diff[col_name][side] = val
    diff_details.append({"行索引": row_idx, "差异内容": row_diff})

# 在Jupyter中展示结构化结果
display(pd.DataFrame(diff_details))

方法2:逐行打印差异信息(高可读性审计友好)

def print_row_diffs(diff_df):
    for idx, row in diff_df.iterrows():
        print(f"=== 行索引: {idx} ===")
        # 按主列分组展示新旧值差异
        grouped_cols = row.dropna().groupby(level=0)
        for col, vals in grouped_cols:
            old_val = vals.get((col, 'self'), '无记录')
            new_val = vals.get((col, 'other'), '无记录')
            print(f"列 {col}: 旧值 = {old_val}, 新值 = {new_val}")
        print("\n")

# 调用函数展示差异
print_row_diffs(diff)

方法3:用Styler自定义表格显示(保留DataFrame形态)

如果希望保留表格样式,同时自动隐藏每行的空列,可借助pandas的Styler功能:

def hide_empty_cells(row):
    # 非空单元格正常显示,空单元格隐藏
    return ['display: table-cell' if pd.notna(val) else 'display: none' for val in row]

# 应用样式并在Jupyter中展示
diff.style.apply(hide_empty_cells, axis=1)

各方法适用场景

  • 方法1:适合需要将差异导出为结构化数据(如CSV、JSON)的场景;
  • 方法2:适合快速审计,逐行清晰查看每个列的新旧值变化;
  • 方法3:适合需要保留表格视觉形态,同时简化每行显示内容的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:12:40