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

如何在Pandas DataFrame中返回单元格差异

获取Pandas DataFrame中的单元格差异

如果你需要对比两个结构相似的Pandas DataFrame,找出它们之间的单元格级差异,我这儿有个经过验证的实用方案,能帮你清晰定位不同之处,甚至可以直观高亮展示差异。

完整可运行代码示例

import sys
import pandas as pd
from io import StringIO

# 处理Python版本兼容(Python2用StringIO.StringIO,Python3用io.StringIO)
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO

# 创建第一个测试DataFrame
DF1 = StringIO("""id Name score isEnrolled Comment
111 Jack 2.17 True "He was late to class"
112 Nick 1.11 False "Graduated"
113 Zoe NaN True " "
""")

# 创建第二个测试DataFrame(包含几处和DF1的差异)
DF2 = StringIO("""id Name score isEnrolled Comment
111 Jack 2.17 True "He was late to class"
112 Nick 1.21 False "Graduated with honors"
113 Zoe 3.50 True "Perfect attendance"
""")

# 读取DataFrame
df1 = pd.read_csv(DF1, sep='\s+')
df2 = pd.read_csv(DF2, sep='\s+')

# 合并两个DataFrame,保留所有行和列
merged_df = df1.merge(df2, on='id', how='outer', suffixes=('_df1', '_df2'))

# 定义函数:对比同一行的对应列,标记差异
def highlight_diff(row):
    diff_cols = []
    for col in df1.columns:
        if col == 'id':
            continue
        val1 = row[f"{col}_df1"]
        val2 = row[f"{col}_df2"]
        # 处理NaN的情况,避免把两个NaN误判为差异
        if pd.isna(val1) and pd.isna(val2):
            continue
        if val1 != val2:
            diff_cols.append(f"{col}_df1")
            diff_cols.append(f"{col}_df2")
    return ['background-color: yellow' if col in diff_cols else '' for col in merged_df.columns]

# 应用高亮样式并展示
styled_df = merged_df.style.apply(highlight_diff, axis=1)
styled_df

关键逻辑说明

  • 数据准备:用StringIO模拟CSV数据方便快速测试,实际使用时可以替换成读取本地文件或数据库数据。
  • 合并DataFrame:通过merge方法以id为键合并两个表,添加后缀区分不同来源的列,把同一行的对应数据放在一起对比。
  • 差异标记:自定义highlight_diff函数逐行对比对应列的值,把有差异的单元格背景标黄,直观突出变化。
  • NaN处理:专门判断了NaN的情况,避免把两个NaN误判为差异。

运行这段代码后,你会得到一个带高亮的表格,所有存在差异的单元格都会被黄色背景标记,一眼就能看到哪些内容发生了变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:00:20