比较两个具有差异长度的数据帧以查找特定列中的差异

Comparing two Dataframes with diff length to find difference in specific column

我有 2 个数据帧具有相同的列但长度不同。

in [1] : df_g = pd.DataFrame([['EDC_TRAING_NO', 'EDU_T_N', 'NUMVER', '20'],
               ['EDC_TRAING_NAME', 'EDU_T_NM', 'VARCHAR', '40'],
               ['EDC_TRAING_ST', 'EDU_T_SD', 'DATETIME', '15'],
               ['EDC_TRAING_END', 'EDU_T_ED', 'DATETIME', '15'],
               ['EDC_PLACE_NM', 'EDU_P_NM', 'VARCHAR2', '40'],
               ['ONLINE_REQST_POSBL_AT', 'ONLINE_R_P_A', 'VARCHAR2', '1']],
              columns=['NAME', 'ID', 'TYPE', 'LEN'])

in [2] : df_n = pd.DataFrame([['EDC_TRAING_NO', 'EDU_TR_N', 'NUMVER', '20'],
               ['EDC_TRAING_NAME', 'EDU_TR_NM', 'VARCHAR', '20'],
               ['EDC_TRAING_ST', 'EDU_TR_SD', 'DATETIME', '15'],
               ['EDC_TRAING_END', 'EDU_T_ED', 'DATETIME', '15'],
               ['EDC_PLACE_NM', 'EDU_PL_NM', 'VARCHAR2', '40'],
               ['ONLINE_REQST_POSBL_AT', 'ONLINE_REQ_P_A', 'VARCHAR2', '1']],
              columns=['NAME', 'ID', 'TYPE', 'LEN'])

我想得到的结果:

result = pd.DataFrame([['EDC_TRAING_NO', 'EDU_TR_N', 'NUMVER', '20'],
                   ['EDC_TRAING_ST', 'EDU_TR_SD', 'DATETIME', '15'],
                   ['EDC_TRAING_END', 'EDU_T_ED', 'DATETIME', '15'],
                   ['EDC_PLACE_NM', 'EDU_PL_NM', 'VARCHAR2', '40'],
                   ['ONLINE_REQST_POSBL_AT', 'ONLINE_REQ_P_A', 'VARCHAR2', '1']],
                  columns=['NAME', 'ID', 'TYPE', 'LEN'])

每个 df 都有这样的长度。

len(df_g) : 1000
len(df_n) : 5000

每个数据框都有名为'name, id, type, len'

我需要检查每个 df 中的那些列(名称、类型、len)以比较“id”列是否具有相同的值。

所以我这样试过。

for i in g.index:
    for j in n.index:
        g = g.iloc[i].values
        # make it to ndarray
        g_Str = g[0] + g[2] + g[3]
        # make it to str for pivot
        n = n.iloc[j].values
        n_Str = n[0] + str(n[2]) + str(n[3])
        # comparing and check two df
        if g_Str == n_Str and g[1] != n[1]:
            print(i, j)
            print(g[0])

我有上面的代码用于 2 个不同长度的 DataFrame。 首先,我尝试使用 'iterrows()' 来比较这两个 df, 但是花了太多时间。(很慢)

我寻找了其他方法来使其性能更好。

我发现的可能方法

还有其他更好的选择吗? 或不使用嵌套 for 循环的任何选项?

谢谢。

你可以试试merge, 如果您正在寻找 ID 不匹配的记录,那么以下是实现它的一种方法:

r1=df_g.merge(df_n,on=['NAME', 'TYPE', 'LEN'],how='inner').query('ID_x != ID_y').rename(columns={'ID_x': 'ID'}).drop('ID_y', 1)

我使用过how="inner" join,但根据需要可以使用以下任意一种join: {‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’}, 默认‘inner’