2017-05-12 43 views
0

感謝堆棧溢出註釋,我創建了一個使用pandas比較兩個數據幀的小函數。比較2個數據幀,只返回不同的單元格,將NaNs視爲相等

# 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) 

如何修改的結果,例如,該 一個)或者僅將細胞顯示不同,例如

dfCompare(a1,a2) 

enter image description here

b)或具有不同值

到 「標記」(例如高亮顯示,或格式的值粗體,...)的單元
dfCompare(a1,a3) 

enter image description here

由於任何幫助和想法!

回答

1

這是相對直接的,但是您無意中(或者可能是注意地)包括一個比較,這使得這有點棘手 - 這就是你想要NaN == NaN評估爲真的NaN的比較。但如this question及後續答案顯示,NaN == NaN評估爲False。因此,知道並且不提供突出顯示的指示(因爲我的終端只能用黑白打印,而且您沒有指定用於查看顏色格式的內容),以下是我可以提供的最佳選擇(簡單地添加一個「 - X」給那些不匹配):

a1[(a1 != a3) & ((a1 == a1) & (a3 == a3))] += ' - X' 
+0

啊,謝謝你的解釋。作爲初學者,我不知道NaN == NaN。感謝您的代碼,但它給了我錯誤「無法比較[' - X']與塊值」。關於突出顯示:這個想法是,如果總是顯示完整的行,以某種方式顯着增強不匹配的單元格。例如。着色細胞,或任何最簡單的。 – user2006697

相關問題