比较数据帧的新版本以识别对新数据帧的更改

2024-06-14 06:06:27 发布

您现在位置:Python中文网/ 问答频道 /正文

df = pd.DataFrame({'ID': [1, 2, 3], 'ETD': ['06.02.2021', '05.01.2021', '07.02.2021'], 'ETA':['06.02.2021', '05.01.2021', '07.02.2021']}, 
                  columns=['ID', 'ETD', 'ETA'])

    ID  ETD         ETA
0   1   06.02.2021  06.02.2021
1   2   05.01.2021  05.01.2021
2   3   07.02.2021  07.02.2021



df2 = pd.DataFrame({'ID': [1, 2, 3], 'ETD': ['07.02.2021', '05.01.2021', '07.02.2021'], 'ETA':['06.02.2021', '05.01.2021', '04.02.2021']}, 
                  columns=['ID', 'ETD', 'ETA'])

    ID  ETD         ETA
0   1   07.02.2021  06.02.2021
1   2   05.01.2021  05.01.2021
2   3   07.02.2021  04.02.2021

这两个Dfs具有相同的列,但它们可以具有不同的长度。根据ID键,我想比较ETA和ETD日期,如果有差异,必须复制行

以其他方式传递到新数据帧

所需DF:

df_CNG = pd.DataFrame({'ID': [1, 3], 'ETA-last': ['06.02.2021', '07.02.2021'],'ETD-last': ['    06.02.2021', '07.02.2021'],'ETD-new': ['07.02.2021', '07.02.2021'], 'ETA-new':['06.02.2021', '04.02.2021']}, 
                  columns=['ID', 'ETA-last', 'ETD-new', 'ETA-last', 'ETA-new'])

    ID  ETA-last    ETD-new     ETA-last    ETA-new
0   1   06.02.2021  07.02.2021  06.02.2021  06.02.2021
1   3   07.02.2021  07.02.2021  07.02.2021  04.02.2021


作为一个解决方案,我试着一行一行地做一个while循环,比较日期并将单元格复制到df_CNG,但这很慢,而且jupyter笔记本上的页面变得没有响应,加载时间太长。有更好的办法吗

e = 0
Rows_e = len(df2)
while True:
    print(e)
    if e == Rows_e:
        break
    else:
        l = 0
        Rows_l = len(df)
        while True:
            print(l)
            if l == (Rows_l+1):
                break
            else:
                if (df2.loc[e,'ID'] == df.loc[l,'ID']):
                    
                    if df2.loc[e,'ETD'] == df.loc[l,'ETD'] and df2.loc[e,'ETA'] == df.loc[l,'ETA']:
                        e+=1
                        break
                       
                    elif df2.loc[e,'ETD'] != df.loc[l,'ETD'] or df2.loc[e,'ETA'] != df.loc[l,'ETA']:
                        df_CNG.loc[e,'ETD-new'] = df2.loc[e,'ETD']
                        df_CNG.loc[e,'ETD-last'] = df.loc[l,'ETD']
                        
                        df_CNG.loc[e,'ETA-new'] = df2.loc[e,'ETA']
                        df_CNG.loc[e,'ETA-last'] = df.loc[l,'ETA']
                        
                        df_CNG.loc[e,'ID'] = df2.loc[e,'ID']
                        
                            
                        e+=1
                        break
                        
                    
                    else: 
                        e+=1
                        break
                else:
                    l+=1


Tags: iddataframedfnewifelselocrows
1条回答
网友
1楼 · 发布于 2024-06-14 06:06:27

尝试合并ID上的两个df,然后将ID作为索引:

out=df.merge(df2,on='ID',how='inner',suffixes=('-last','-new'))
#(If you need outer merge then instead of 'inner' write how='outer' in the above code)

然后:

m=(out['ETA-new'].eq(out['ETA-last'])) & (out['ETD-new'].eq(out['ETD-last']))
#check if values are equal or not
out=out[~m]
#Filter out result

out的输出:

    ID  ETD-last    ETA-last    ETD-new     ETA-new
0   1   06.02.2021  06.02.2021  07.02.2021  06.02.2021
1   3   07.02.2021  07.02.2021  07.02.2021  04.02.2021

相关问题 更多 >