代码之家  ›  专栏  ›  技术社区  ›  RustyShackleford

如何连接两个ID不匹配的数据帧,并创建新列来表示来自哪个数据帧ID?

  •  2
  • RustyShackleford  · 技术社区  · 7 年前

    我有两个这样的数据帧

    DF1:

    id    column1    column2 
    1      30          90
    2      1            2
    

    DF2:

    id    column1    column2 
    1      30          90
    3      1            2
    

    我想创建合并这两个数据帧的逻辑,其中ID不匹配(列名相同),然后我想创建一个新列,说明ID来自哪个数据帧。我该怎么做?

    最终合并数据框:

    id    column1    column2    df_name
    2      30          90         df1
    3      1            2         df2
    

    编辑:

    最终的df能从两个数据帧中拉入所有列吗?

     id    column1.df1    column2.df1   column1.df2    column2.df2     df_name
        2      30          90                 30            90           df1
        3      1            2                  1             2           df2
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   jezrael    7 年前

    弗斯特 concat 数据帧在一起:

    df = (pd.concat([df1, df2],  keys=('df1','df2'))
            .rename_axis(('df_name','idx'))
            .reset_index(level=1, drop=True)
            .reset_index())
    
    print (df)
      df_name  id  column1  column2
    0     df1   1       30       90
    1     df1   2        1        2
    2     df2   1       30       90
    3     df2   3        1        2
    

    那就都一样了 id 以下内容:

    a = df1.merge(df2, on='id')['id']
    

    最后一个筛选依据 isin :

    df = df[~df['id'].isin(a)]
    print (df)
      df_name  id  column1  column2
    1     df1   2        1        2
    3     df2   3        1        2
    

    编辑:

    类似的解决方案,如@w-b,只添加了参数 身份证件 suffixes :

    df = (df1.merge(df2,indicator=True,how='outer', on='id', suffixes=('_df1','_df2'))
             .query("_merge != 'both'"))
    df['_merge'] = df['_merge'].map({'left_only':'df1','right_only':'df2'})
    
    print (df)
       id  column1_df1  column2_df1  column1_df2  column2_df2 _merge
    1   2          1.0          2.0          NaN          NaN    df1
    2   3          NaN          NaN          1.0          2.0    df2
    

    如果要所有行,也要相同的行 身份证件 :

    df['_merge'] = df['_merge'].map({'left_only':'df1','right_only':'df2', 'both':'df1+df2'})
    
    print (df)
       id  column1_df1  column2_df1  column1_df2  column2_df2   _merge
    0   1         30.0         90.0         30.0         90.0  df1+df2
    1   2          1.0          2.0          NaN          NaN      df1
    2   3          NaN          NaN          1.0          2.0      df2
    
        2
  •  2
  •   BENY    7 年前

    让我们一起做 merge

    df=df1.merge(df2,indicator = True,how='outer').loc[lambda x : x['_merge'].ne('both')]
    df['df_name']=df['_merge'].map({'left_only':'df1','right_only':'df2'})
    df
    Out[328]: 
       id  column1  column2      _merge df_name
    1   2        1        2   left_only     df1
    2   3        1        2  right_only     df2