2015-12-14 82 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值行列。我不知道你是否需要这个。