我有 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')
过滤掉列不相等的is_open行
df = df[df["is_open_x"]!=df["is_open_y"]]
df
要rename
列作为您的期望
df.rename(columns={"is_open_x":"is_open_df1","is_open_y":"is_open_df2"})

ITMISS
TA贡献1871条经验 获得超8个赞
这个怎么样?
df1['is_open_df2'] = df2['is_open']expected_result_df = df1[df1['is_open'] != df1[is_open_df2']]

三国纷争
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 具有唯一值,则有效……在使用此之前,您可以删除其中存在的重复项。
添加回答
举报
0/150
提交
取消