【问题标题】:pandas compare two dataframes and their columns to find difference by reference column熊猫比较两个数据框及其列以通过参考列查找差异
【发布时间】:2021-02-23 15:59:35
【问题描述】:

我正在尝试根据 ref 列比较 pandas 中的两个数据框并找出差异。

数据框如下所示

"Dataframe 1":
ref        key1        key2        key3        key4        key5
001        vk11        vk12        vk13        vk14        vk15
002        vk21        vk22        vk23        vk24        vk25
003        vk31        vk32        vk33        vk34        vk35
004        vk41        vk42        vk43        vk44        vk45
005        vk51        vk52        vk53        vk54        vk55
006        vk61        vk62        vk63        vk64        vk65


"Dataframe 2":
ref        key1        key2        key3        key4        key5
001        vk11        vk12        vk13        vk14        vk15
002        vk21        vkkk        vk23        vk24        vk25
003        vk31        vk32        vk33        vkkk        vk35
005        vkkk        vkkk        vkkk        vk54        vk55

最终结果集应如下所示。

  1. 删除数据框 2 中不存在的引用
  2. 删除完全匹配的行
  3. 最终 OP 应如下所示

“最终数据框”:

key   key1  key1  key1  key2  key2   key2  key3  key3  key3  key4  key4  key4  key5  key5  key5
Hdr   DF-1  DF-2  VALC  DF-1  DF-2   VALC  DF-1  DF-2  VALC  DF-1  DF-2  VALC  DF-1  DF-2  VALC
002   vk21  vk21  N     vk22  vkkk   Y     vk23  vk23  N     vk24  vk24  N     vk25  vk25  N
003   vk31  vk31  N     vk32  vk32   N     vk33  vk33  N     vk34  vkkk  Y     vk35  vk35  N
005   vk51  vkkk  Y     vk52  vkkk   Y     vk53  vkkk  Y     vk54  vk54  Y     vk55  vk55  N

PC:VALC - 值已更改; DF1 - 数据帧 1; DF2 - 数据框 2;

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    首先使用concatinner 连接和键参数:

    df = pd.concat([df1.set_index('ref'), df2.set_index('ref')], 
                   axis=1, 
                   join='inner',
                   keys=('df1','df2'))
    

    然后通过DataFrame.xs比较选定的值,并使用numpy.whereMultiIndex.from_product创建新的DataFrame

    mask = df.xs('df1', axis=1).eq(df.xs('df2', axis=1))
    
    df1 = pd.DataFrame(np.where(mask, 'N','Y'), 
                      index=mask.index,
                      columns=pd.MultiIndex.from_product([['valc'], mask.columns]))
    print (df1)
        valc                    
        key1 key2 key3 key4 key5
    ref                         
    1      N    N    N    N    N
    2      N    Y    N    N    N
    3      N    N    N    Y    N
    5      Y    Y    Y    N    N
    

    连接在一起并对列进行排序:

    df = pd.concat([df, df1], axis=1).sort_index(axis=1, level=[1,0])
    

    DataFrame.all 删除相等的行,用~ 删除反转掩码:

    df = df[~mask.all(axis=1)]
    

    print (df)
          df1   df2 valc   df1   df2 valc   df1   df2 valc   df1   df2 valc   df1  \
         key1  key1 key1  key2  key2 key2  key3  key3 key3  key4  key4 key4  key5   
    ref                                                                             
    2    vk21  vk21    N  vk22  vkkk    Y  vk23  vk23    N  vk24  vk24    N  vk25   
    3    vk31  vk31    N  vk32  vk32    N  vk33  vk33    N  vk34  vkkk    Y  vk35   
    5    vk51  vkkk    Y  vk52  vkkk    Y  vk53  vkkk    Y  vk54  vk54    N  vk55   
    
          df2 valc  
         key5 key5  
    ref             
    2    vk25    N  
    3    vk35    N  
    5    vk55    N  
    

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2020-06-08
      • 1970-01-01
      • 2019-06-29
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多