为了账号安全,请及时绑定邮箱和手机立即绑定

比较 2 Pandas Dataframes 并返回所有不同的行

比较 2 Pandas Dataframes 并返回所有不同的行

潇湘沐 2021-11-02 16:18:26
我有 2 个具有相同架构和不同数据的数据帧。我想比较它们并获取任何列具有不同值的所有行。“df1”:id   Store         is_open1   'Walmart'      true2   'Best Buy'     false3   'Target'       true4   'Home Depot'   true“df2”:id   Store         is_open1   'Walmart'      false2   'Best Buy'     true3   'Target'       true4   'Home Depot'   false我能够得到差异,但我没有得到所有的列,而只是那些已经改变的列。所以我得到以下输出:结果_df:id   is_open  is_open1   true       false2   false      true4   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 列的所有相同列,因此我的预期输出是: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 我怎样才能做到这一点?
查看完整描述

3 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

使用熊猫merge功能

df = pd.merge(df1,df2[['id','is_open']],on='id')

//img1.sycdn.imooc.com//6180f46e0001d05605550367.jpg

过滤掉列不相等的is_open行


df = df[df["is_open_x"]!=df["is_open_y"]]

df

//img1.sycdn.imooc.com//6180f47900015c7b05270221.jpg

rename列作为您的期望

df.rename(columns={"is_open_x":"is_open_df1","is_open_y":"is_open_df2"})

//img1.sycdn.imooc.com//6180f4860001209805820229.jpg

查看完整回答
反对 回复 2021-11-02
?
ITMISS

TA贡献1871条经验 获得超8个赞

这个怎么样?

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


查看完整回答
反对 回复 2021-11-02
?
三国纷争

TA贡献1804条经验 获得超7个赞

如果数据帧的长度不同。这是你可以使用的东西。

new_df = pd.concat([df1, df2]).reset_index(drop=True)
df = new_df.drop_duplicates(subset=['col1','col2'], keep=False)

这将为您提供一个名为 df 的数据框,其中仅包含不同的记录。

  • 其中 df1 和 df2 是您要比较的两个数据框。

  • 子集=要为其查找重复项的列列表。

  • keep= false 将删除与其原始值相同的值。

  • keep=last 将保留第二个数据帧中的记录。

  • keep=first 将保留第一个数据帧中的记录。

如果数据帧的长度相同

df=np.where(df1==df2,'true','false')

希望这可以帮助!!如果 df1 和 df2 具有唯一值,则有效……在使用此之前,您可以删除其中存在的重复项。


查看完整回答
反对 回复 2021-11-02
  • 3 回答
  • 0 关注
  • 350 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号