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

