Python 使用merge检测数据帧中的差异
我使用merge将两个数据帧连接在一起。这两个数据帧是来自数据库表的两个不同日期的数据。我需要弄清楚是什么改变了。行的数量会有所不同,但我只想通过内部连接将较新的数据集连接到较旧的数据集,然后看看发生了什么变化 目前,我正在利用数据帧的Python 使用merge检测数据帧中的差异,python,pandas,Python,Pandas,我使用merge将两个数据帧连接在一起。这两个数据帧是来自数据库表的两个不同日期的数据。我需要弄清楚是什么改变了。行的数量会有所不同,但我只想通过内部连接将较新的数据集连接到较旧的数据集,然后看看发生了什么变化 目前,我正在利用数据帧的\ux和\uy命名以及.columns数据来比较合并后字段的差异 一定有更简单的方法。我确实尝试过使用1.1.0中新的compare()方法,但它似乎不喜欢具有不同形状的帧(在我的例子中是行),这使得它对我毫无用处 def get_changed_records(
\ux
和\uy
命名以及.columns
数据来比较合并后字段的差异
一定有更简单的方法。我确实尝试过使用1.1.0中新的compare()
方法,但它似乎不喜欢具有不同形状的帧(在我的例子中是行),这使得它对我毫无用处
def get_changed_records(df_old, df_new, file_info):
join_keys = file_info["compare_col"].split(",");
old_file_name = file_info["old_file_name"]
new_file_name = file_info["new_file_name"]
print("Changed Records: JOIN DATA FRAMES ON COLUMNS: previous file ", old_file_name, " current_file_name ", " new file name ", new_file_name)
columns = df_new.columns
df_merged = df_new.merge(df_old, how='inner', on=join_keys, indicator=True)
changed_records = []
for idx, row in df_merged.iterrows():
changes = []
for col in columns:
if col not in join_keys:
after_col = col + '_x';
before_col = col + '_y';
else:
after_col = col
before_col = col
after_val = row[after_col];
before_val = row[before_col];
changed = False
if pd.isnull(before_val) or pd.isnull(after_val):
if pd.isnull(before_val) == False and pd.isnull(after_val) == True:
changed = True;
if pd.isnull(before_val) == True and pd.isnull(after_val) == False:
changed = True;
if pd.isnull(before_val) == True and pd.isnull(after_val) == True:
changed = False;
elif after_val != before_val:
print("COLUMN_CHANGE: ", col, " before ", before_val, " after ", after_val);
changed = True;
if changed == True:
print('-' * 50);
print('-Adding changes to result...')
changes.append(['COLUMN_CHANGE', col, before_val, after_val, row, join_keys]);
print(changes);
if len(changes) > 0:
changed_records.append(changes);
print("changed records ", len(changed_records));
print(changed_records);
return changed_records
我会推荐这样的东西:
pd.merge(left,right,how='right'
这将向您显示值过多的行。检查更多我不确定这些示例中是否有任何一个给我一个单元格对差异的细分,以及每个更改单元格的前后视图忽略我的注释,我现在看到您确实在尝试内部联接。您是否可以添加一些模拟数据,例如有人试着给出一个合适的答案吗?我建议这样:pd.merge(left,right,how='right'
这将向您显示值过多的行。检查更多我不确定这些示例中是否有任何一个给我一个单元格对差异的细分,以及每个更改单元格的前后视图忽略我的注释,我现在看到您确实在尝试内部联接。您是否可以添加一些模拟数据,例如有人试着给出一个合适的答案吗?