![](/img/trans.png)
[英]How to concat dataframes but only where ID column value is both dataframes and delete the rows where IDs do not match?
[英]How to join two dataframes where IDs do not match and create new column to represent what dataframe ID came from?
我有两个这样的数据框
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
第一个concat
DataFrames在一起:
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
让我们来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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.