比较两个pandas数据帧的差异

时间:2015-12-14 18:47:05

标签: python pandas

我有两个数据帧,我想比较它们,然后并排显示差异。我一直在使用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()以便我不会出现歧义错误?

修改

要求的基本代码示例:

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']}

1 个答案:

答案 0 :(得分:0)

我正在使用pandas版本'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值。我不知道你是否需要那个。