Python 比较2个数据帧并返回所有不同的行

Python 比较2个数据帧并返回所有不同的行,python,pandas,Python,Pandas,我有两个数据帧,具有相同的模式和不同的数据。我想比较这两种方法,并得到所有具有不同列值的行 df1: df2: 我能够得到差异,但我没有得到所有的列,只有那些已经更改的列。因此,我得到以下输出: 结果: id is_open is_open 1 true false 2 false true 4 true false 以下是实现上述输出的代码: ne_stacked = (from_aoi_df != to_aoi_df).stack()

我有两个数据帧,具有相同的模式和不同的数据。我想比较这两种方法,并得到所有具有不同列值的行

df1:

df2:

我能够得到差异,但我没有得到所有的列,只有那些已经更改的列。因此,我得到以下输出:

结果:

id   is_open  is_open
1   true       false
2   false      true
4   true       false
以下是实现上述输出的代码:

ne_stacked = (from_aoi_df != to_aoi_df).stack() 
changed = ne_stacked[ne_stacked]
changed.index.names = ['id', 'col_changed']

difference_locations = np.where(from_aoi_df != to_aoi_df)
changed_from = from_aoi_df.values[difference_locations]
changed_to = to_aoi_df.values[difference_locations]
df5=pd.DataFrame({'from': changed_from, 'to': changed_to})
df5
但是,除了上面的结果之外,我还需要添加Store column的所有相同的列,因此我的预期输出是:

expected_result_df:
        id Store         is_open_df1  is_open_df2    
        1   Walmart       true        false 
        2   Best Buy      false       true        
        4   Home Depot    true        false 
我怎样才能做到这一点

这个怎么样

df1['is_open_df2'] = df2['is_open']

expected_result_df = df1[df1['is_open'] != df1[is_open_df2']]
使用:

使用多个已更改的列验证解决方案:

#changed first value id column
print (from_aoi_df)
   id       Store  is_open
0  10     Walmart     True
1   2    Best Buy    False
2   3      Target     True
3   4  Home Depot     True

m = (from_aoi_df != to_aoi_df)
m1 = m.any(axis=0)
m2 = m.any(axis=1)

df1 = from_aoi_df.loc[m2, m1].add_suffix('_df1')
df2 = to_aoi_df.loc[m2, m1].add_suffix('_df2')
df3 = from_aoi_df.loc[m2, ~m1]

df = pd.concat([df3, df1, df2], axis=1)
print (df)
        Store  id_df1  is_open_df1  id_df2  is_open_df2
0     Walmart      10         True       1        False
1    Best Buy       2        False       2         True
3  Home Depot       4         True       4        False
使用合并函数

筛选出具有不相等的is_开放列的行

将列重命名为您的期望值

重命名列={is_open_x:is_open_df1,is_open_y:is_open_df2}

如果数据帧的长度不同。这是你可以用的东西。 这将为您提供一个名为df的数据帧,其中只包含不同的记录

其中,df1和df2是您尝试比较的两个数据帧。 子集=要为其查找重复项的列的列表。 keep=false将删除与其原始值相同的重复值。 keep=last将保留第二个数据帧中的记录。 keep=first将保留第一个数据帧中的记录。 如果数据帧的长度相同 希望这有帮助!!
如果df1和df2具有唯一的值,则可以使用此选项。在使用此选项之前,可以删除其中存在的任何重复项。

合并具有后缀选项。
df1['is_open_df2'] = df2['is_open']

expected_result_df = df1[df1['is_open'] != df1[is_open_df2']]
#compare DataFrames
m = (from_aoi_df != to_aoi_df)
#check at least one True per columns
m1 = m.any(axis=0)
#check at least one True per rows
m2 = m.any(axis=1)

#filter only not equal values
df1 = from_aoi_df.loc[m2, m1].add_suffix('_df1')
df2 = to_aoi_df.loc[m2, m1].add_suffix('_df2')

#filter equal values    
df3 = from_aoi_df.loc[m2, ~m1]

#join together
df = pd.concat([df3, df1, df2], axis=1)
print (df)
   id       Store  is_open_df1  is_open_df2
0   1     Walmart         True        False
1   2    Best Buy        False         True
3   4  Home Depot         True        False
#changed first value id column
print (from_aoi_df)
   id       Store  is_open
0  10     Walmart     True
1   2    Best Buy    False
2   3      Target     True
3   4  Home Depot     True

m = (from_aoi_df != to_aoi_df)
m1 = m.any(axis=0)
m2 = m.any(axis=1)

df1 = from_aoi_df.loc[m2, m1].add_suffix('_df1')
df2 = to_aoi_df.loc[m2, m1].add_suffix('_df2')
df3 = from_aoi_df.loc[m2, ~m1]

df = pd.concat([df3, df1, df2], axis=1)
print (df)
        Store  id_df1  is_open_df1  id_df2  is_open_df2
0     Walmart      10         True       1        False
1    Best Buy       2        False       2         True
3  Home Depot       4         True       4        False
df = pd.merge(df1,df2[['id','is_open']],on='id')
df = df[df["is_open_x"]!=df["is_open_y"]]
df
new_df = pd.concat([df1, df2]).reset_index(drop=True)
df = new_df.drop_duplicates(subset=['col1','col2'], keep=False)
df=np.where(df1==df2,'true','false')