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

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
添加回答
举报