我有一个python项目:
df_testR,列={名称、城市、许可证、金额}
df_testF,列={名称、城市、许可证、金额}
我想比较一下这两个df。结果应该是df,我在这里看到了名称、城市和许可证以及金额。通常,df_testR和df_testF应该完全相同。如果不一样,我想看看Amount_R和Amount_F的区别。
我提到:熊猫中两个数据帧之间的差异
但我收到了一张只有TRUE和FALSE的表格:
名称 | 城市 | 许可证金额 | |
---|---|---|---|
真 |
import copy
import pandas as pd
data1 = {'Name': ['A', 'B', 'C'], 'City': ['SF', 'LA', 'NY'], 'Licence': ['YES', 'NO', 'NO'], 'Amount': [100, 200, 300]}
data2 = copy.deepcopy(data1)
data2.update({'Amount': [500, 200, 300]})
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df2.drop(1, inplace=True)
首先找到缺失的行并打印:
matching = df1.isin(df2)
meta_data_columns = ['Name', 'City', 'Licence']
metadata_match = matching[meta_data_columns]
metadata_match['check'] = metadata_match.apply(all, 1, raw=True)
missing_rows = list(metadata_match.index[~metadata_match['check']])
if missing_rows:
print('Some rows are missing from df2:')
print(df1.iloc[missing_rows, :])
然后删除这些行并合并:
df3 = pd.merge(df2, df1.drop(missing_rows), on=meta_data_columns)
现在删除具有相同数量的行:
df_different_amounts = df3.loc[df3['Amount_x'] != df3['Amount_y'], :]
我假设DF已经排序。如果您处理的是非常大的DFs,那么最好先过滤DFs,使合并更快。