2015-12-14 88 views
0

我有兩個數據框,我想比較它們,然後並排顯示差異。我一直在使用從this question接受的解決方案,但現在遇到了ne_stacked = (current_df != new_df).stack()錯誤。比較兩個熊貓數據框的差異

這用於正常工作,但我現在得到的錯誤是The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().。在查看所有這些選項的文檔後,我不確定如何實現它們中的任何一個,並在我的代碼中保留相同的功能。

我將如何去取代ne_stacked = (current_df != new_df).stack(),所以我沒有得到模糊性錯誤?

編輯

Basic代碼的要求例如:

d = {'a':[1,2,3],'b':[1,2,3],'c':[1,2,3]} 
d2 = {'a':[4,2,3],'b':[1,4,3],'c':[1,2,4]} 
df1 = pd.DataFrame(d) 
df2 = pd.DataFrame(d2) 
print (df1 != df2) //returns true when value in df1 is not equal to df2 

     a  b  c 
0 True False False 
1 False True False 
2 False False True 

所以!=表達工作得很好,對於這個簡單的數據幀,但不是我使用了更復雜的(如下圖)。

df1 = {'CORE': [{'satellite': '2B', 
    'windowEnd': '2015-218 04:00:00', 
    'windowStart': '2015-217 20:00:00'}], 
'DURATION': [500.0], 
'PRIORITY': [5], 
'RATE': [u'HIGH_RATE'], 
'STATUS': [u'ACTIVE'], 
'TASK_ID': [1], 
'TYPE': [u'NOMINAL'], 
'WINDOW_END': ['2015-218 04:00:00'], 
'WINDOW_START': ['2015-217 20:00:00']} 

df2 = {'CORE': [{'satellite': '2B', 
    'windowEnd': '2015-220 04:00:00', 
    'windowStart': '2015-219 20:00:00'}], 
'DURATION': [500.0], 
'PRIORITY': [5], 
'RATE': [u'HIGH_RATE'], 
'STATUS': [u'ACTIVE'], 
'TASK_ID': [2], 
'TYPE': [u'NOMINAL'], 
'WINDOW_END': ['2015-220 04:00:00'], 
'WINDOW_START': ['2015-219 20:00:00']} 
+0

返回什麼'(df1!= df2)'?你可以添加[mcve](http://stackoverflow.com/help/mcve)嗎? – jezrael

+0

@jezrael我爲'(df1!= df2)' – kdubs

+0

添加了一個基本代碼示例嗯,我認爲這與你的示例非常吻合。也許在你的數據框中有問題。有可能分享他們嗎? – jezrael

回答

0

我使用的是熊貓版'0.16.2',我沒有看到任何錯誤,當我試圖評估df1 != df2

看看我下面的代碼:

import pandas as pd 

d1 = {'CORE': [{'satellite': '2B', 
    'windowEnd': '2015-218 04:00:00', 
    'windowStart': '2015-217 20:00:00'}], 
    'DURATION': [500.0], 
    'PRIORITY': [5], 
    'RATE': [u'HIGH_RATE'], 
    'STATUS': [u'ACTIVE'], 
    'TASK_ID': [1], 
    'TYPE': [u'NOMINAL'], 
    'WINDOW_END': ['2015-218 04:00:00'], 
    'WINDOW_START': ['2015-217 20:00:00']} 

d2 = {'CORE': [{'satellite': '2B', 
    'windowEnd': '2015-220 04:00:00', 
    'windowStart': '2015-219 20:00:00'}], 
    'DURATION': [500.0], 
    'PRIORITY': [5], 
    'RATE': [u'HIGH_RATE'], 
    'STATUS': [u'ACTIVE'], 
    'TASK_ID': [2], 
    'TYPE': [u'NOMINAL'], 
    'WINDOW_END': ['2015-220 04:00:00'], 
    'WINDOW_START': ['2015-219 20:00:00']} 

df1 = pd.DataFrame(d1) 
df2 = pd.DataFrame(d2) 
print (df1 != df2) 

# It was printed: 
# CORE DURATION PRIORITY RATE STATUS TASK_ID TYPE WINDOW_END WINDOW_START 
# 0 True False  False  False False True  False True  True 

你也可以嘗試使用.any()

print (df1 != df2).any(axis=0) 
# It was printed: 
# CORE    True 
# DURATION  False 
# PRIORITY  False 
# RATE   False 
# STATUS   False 
# TASK_ID   True 
# TYPE   False 
# WINDOW_END  True 
# WINDOW_START  True 
# dtype: bool 

請注意使用.any(),因爲它會尋找在整個任何True值行列。我不知道你是否需要這個。