比较 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 以使合并更快。
我有一个 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 以使合并更快。