Python 使用合并显示两个数据帧之间的差异

Python 使用合并显示两个数据帧之间的差异,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我有两个数据帧,如下所示: 在[1]中:旧数据={name:['a','b','c','d'],price:[1,2,3,4],instock:['yes','yes','yes','no']} 在[2]中:新数据={name:['a','b','d','e',price:[1,2,3,4],instock:['yes','yes','yes','no']} 在[3]中:列=[名称、价格、库存] 在[4]中:old_df=pd.DataFrameold_data,columns=columns

我有两个数据帧,如下所示:

在[1]中:旧数据={name:['a','b','c','d'],price:[1,2,3,4],instock:['yes','yes','yes','no']} 在[2]中:新数据={name:['a','b','d','e',price:[1,2,3,4],instock:['yes','yes','yes','no']} 在[3]中:列=[名称、价格、库存] 在[4]中:old_df=pd.DataFrameold_data,columns=columns 在[5]中:new_df=pd.DataFramenew_data,columns=columns 在[6]中:旧头 出[6]: 股票名称价格 0 a 1是 1 b 2是的 2 c 3是的 三维4号 在[7]中:新的头 出[7]: 股票名称价格 0 a 1是 1 b 2是的 2 d 3是的 3 e 4否 请注意,列名是唯一的

现在,如果有人问我这些数据是如何从旧变为新的,我会说:

名为c的产品已不存在。 产品d的价格已从4改为3,现在有现货供应。 我们有一款名为e的新产品,并提供了这些详细信息。 现在我想自动完成这些。由此,我可以看出我可以使用merge。大概是这样的:

在[8]中:old_df.mergenew_df,on=name,indicator=True,how=outer 出[8]: 名称价格指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数 0 a 1.0是1.0都是 1 b 2.0是2.0都是 2 c 3.0是南南左 3 d 4.0否3.0是两者 4 e NaN NaN 4.0仅限右键 现在所有的更改都可见了,我可以编写我想要的报告了。但前两行没有改变的记录也在这里。我想把他们排除在外。我显然可以这样做:

在[9]:has_change=lambda x:x[price_x]!=x[价格y]&x[库存x]!=x[instock__y] 在[10]中:old_df.mergenew_df,on=name,indicator=True,how=outer.loc[已更改] 出[10]: 名称价格指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数 2 c 3.0是南南左 3 d 4.0否3.0是两者 4 e NaN NaN 4.0仅限右键 但这条路似乎很难走。事实上,在我的例子中,有更多的第13栏有很长的名字,这样写所有的栏是不对的。我该怎么做

使用“产品名称”列作为索引 new_df.set_indexname,inplace=True old_df.set_indexname,inplace=True 将新旧数据连接到产品名称上的新数据框 df=old\u df.joinnew\u df,lsuffix=\u old,rsuffix=\u new 例如,自行计算以找出哪些属性已更改 df[price\u drop]=df[price\u old]-df[price\u new] df[is_new_instock]=df[instock_old]==否&df[instock_new]==是
我们可以通过在合并和检查axis=1的所有列的值是否相同之前对索引进行调整来解决这个问题

然后我们合并并过滤掉这些未更改的行:

m = ~old_df.set_index('name').eq(new_df.set_index('name')).all(axis=1)

df = (old_df.merge(new_df, 
                   on="name", 
                   how="outer",
                   suffixes=['_old', '_new'])
      .set_index('name')[m]
      .reset_index()
     )

  name  price_old instock_old  price_new instock_new
0    c        3.0         yes        NaN         NaN
1    d        4.0          no        3.0         yes
2    e        NaN         NaN        4.0          no
      price_old instock_old  price_new instock_new  price_drop  is_new_instock
name                                                                          
a             1         yes        1.0         yes         0.0           False
b             2         yes        2.0         yes         0.0           False
c             3         yes        NaN         NaN         NaN           False
d             4          no        3.0         yes         1.0            True
m = ~old_df.set_index('name').eq(new_df.set_index('name')).all(axis=1)

df = (old_df.merge(new_df, 
                   on="name", 
                   how="outer",
                   suffixes=['_old', '_new'])
      .set_index('name')[m]
      .reset_index()
     )

  name  price_old instock_old  price_new instock_new
0    c        3.0         yes        NaN         NaN
1    d        4.0          no        3.0         yes
2    e        NaN         NaN        4.0          no