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

我有两个这样的数据框


df1:


id    column1    column2 

1      30          90

2      1            2

df2:


id    column1    column2 

1      30          90

3      1            2

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


最终合并的 df:


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


德玛西亚99
浏览 169回答 2
2回答

皈依舞

第一个concatDataFrames 在一起: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  column20     df1   1       30       901     df1   2        1        22     df2   1       30       903     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  column21     df1   2        1        23     df2   3        1        2编辑:类似@WB的解决方案,只添加了参数id和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 _merge1   2          1.0          2.0          NaN          NaN    df12   3          NaN          NaN          1.0          2.0    df2如果想要所有行,也需要相同的行id: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   _merge0   1         30.0         90.0         30.0         90.0  df1+df21   2          1.0          2.0          NaN          NaN      df12   3          NaN          NaN          1.0          2.0      df2

哔哔one

让我们做 mergedf=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'})dfOut[328]:    id  column1  column2      _merge df_name1   2        1        2   left_only     df12   3        1        2  right_only     df2
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python