Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用merge检测数据帧中的差异_Python_Pandas - Fatal编程技术网

Python 使用merge检测数据帧中的差异

Python 使用merge检测数据帧中的差异,python,pandas,Python,Pandas,我使用merge将两个数据帧连接在一起。这两个数据帧是来自数据库表的两个不同日期的数据。我需要弄清楚是什么改变了。行的数量会有所不同,但我只想通过内部连接将较新的数据集连接到较旧的数据集,然后看看发生了什么变化 目前,我正在利用数据帧的\ux和\uy命名以及.columns数据来比较合并后字段的差异 一定有更简单的方法。我确实尝试过使用1.1.0中新的compare()方法,但它似乎不喜欢具有不同形状的帧(在我的例子中是行),这使得它对我毫无用处 def get_changed_records(

我使用merge将两个数据帧连接在一起。这两个数据帧是来自数据库表的两个不同日期的数据。我需要弄清楚是什么改变了。行的数量会有所不同,但我只想通过内部连接将较新的数据集连接到较旧的数据集,然后看看发生了什么变化

目前,我正在利用数据帧的
\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'
这将向您显示值过多的行。检查更多我不确定这些示例中是否有任何一个给我一个单元格对差异的细分,以及每个更改单元格的前后视图忽略我的注释,我现在看到您确实在尝试内部联接。您是否可以添加一些模拟数据,例如有人试着给出一个合适的答案吗?