比较 df,包括对数据的详细洞察

Compare df's including detailed insight in data

我有一个 python 项目:

df_testR 列={'Name', 'City','Licence', 'Amount'}

df_testF 列={'Name', 'City','Licence', 'Amount'}

我想比较两个 df。结果应该是 df,我在这里看到名称、城市和许可证以及金额。通常,df_testR 和 df_testF 应该完全相同。 如果不一样,我想看看 Amount_R 与 Amount_F 的区别。

我提到了:Diff between two dataframes in pandas

但是我收到了 table 只有 TRUE 和 FALSE 的消息:

Name City Licence Amount
True True True False

但我想要一个 table,它仅列出出现差异的行,并以如下方式显示数据之间的差异:

Name City Licence Amount_R Amount_F
Paul NY YES 200 500.

这里,tables 都包含 PAUL、NY 和 License = Yes,但是 Table R 包含 Amount 200,table F 包含 500 amount。我想从我的分析中收到一个 table,它只捕获出现这种差异的行。

有人可以帮忙吗?

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 已排序。 如果您要处理非常大的 DF,最好先过滤 DF 以使合并更快。