Python 比较2个数据帧,只返回不同的单元格,将NaN视为相等

Python 比较2个数据帧,只返回不同的单元格,将NaN视为相等,python,pandas,dataframe,compare,nan,Python,Pandas,Dataframe,Compare,Nan,多亏了堆栈溢出注释,我创建了一个使用pandas比较两个数据帧的小函数 # sample data frames a1 = pd.DataFrame([{'_id' : '71', 'datum': '2009-11-30', 'width':'wide'}, {'_id' : '71', 'datum': np.nan, 'width':'wide'},]) a2 = pd.DataFrame([{'_id' : '71', 'datum': '2009-11-30', 'widt

多亏了堆栈溢出注释,我创建了一个使用pandas比较两个数据帧的小函数

 # sample data frames
 a1 = pd.DataFrame([{'_id' : '71', 'datum': '2009-11-30', 'width':'wide'},
  {'_id' : '71', 'datum': np.nan, 'width':'wide'},])

 a2 = pd.DataFrame([{'_id' : '71', 'datum': '2009-11-30', 'width':'wide'},
  {'_id' : 'A', 'datum': np.nan, 'width':'wide'},])

 a3 = pd.DataFrame([{'_id' : '71', 'datum': '2009-11-30', 'width':'wide'},
  {'_id' : 'A', 'datum': np.nan, 'width':'wider'},])


# compare function
def dfCompare(a,b):
    if a.equals(b) == True:      
        print "no differences detected"
    else:
        df = pd.concat([a,b])
        if not df.drop_duplicates(keep=False).empty:
            return df.drop_duplicates(keep=False)
        else: 
            print "no differences detected"

dfCompare(a1,a2)
如何修改结果,使 a) 要么仅显示不同的单元格,例如

  dfCompare(a1,a2)

b) 或使用不同的值“标记”(例如,高亮显示或将值设置为粗体…)单元格

dfCompare(a1,a3)


谢谢你的帮助和想法

这是相对简单的,但是您无意中(或者可能是无意中)包含了一个比较,这使得这有点棘手-这就是要将
NaN==NaN
计算为True的NaN的比较。但正如随后的答案所示,
NaN==NaN
的计算结果为False

因此,知道这一点,并且不提供突出显示的指示(因为我的终端只打印黑白,而您不指定要使用什么来查看颜色格式),下面是我能提供的最好的指示(只需在不匹配的指示上添加“-X”):


啊,谢谢你的解释。作为一个初学者,我不知道关于NaN==NaN的这一点。谢谢你的代码,但它给了我错误“无法将['-X']与块值进行比较”。关于突出显示:如果始终显示完整的行,则可以通过某种方式明显增强不匹配的单元格。例如,为电池着色,或任何最简单的方法。
a1[(a1 != a3) & ((a1 == a1) & (a3 == a3))] += ' - X'