为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2021-09-01 19:42:42
我有两个这样的数据框df1:id    column1    column2 1      30          902      1            2df2:id    column1    column2 1      30          903      1            2我想创建合并这两个 ID 不匹配的数据帧的逻辑(列名相同),然后我想创建一个新列,说明 ID 来自哪个数据帧。我该怎么做?最终合并的 df:id    column1    column2    df_name2      30          90         df13      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 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

第一个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  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

编辑:


类似@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 _merge

1   2          1.0          2.0          NaN          NaN    df1

2   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   _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


查看完整回答
反对 回复 2021-09-01
?
哔哔one

TA贡献1854条经验 获得超8个赞

让我们做 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


查看完整回答
反对 回复 2021-09-01
  • 2 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信