两个Pandas DataFrame的合并

14

假设我有两个数据框:

df1:

  A
0 a
1 b

df2:

  A
0 a
1 c

我希望结果是两个框架的并集,并且有一个额外的列显示该行属于的源数据框。如果有重复,应删除重复项,并且相应的额外列应显示两个源:

  A  B
0 a  df1, df2
1 b  df1
2 c  df2

我可以按照以下方式获取已去重的连接数据框(df3):

import pandas as pd
df3=pd.concat([df1,df2],ignore_index=True).drop_duplicates().reset_index(drop=True)

我无法想出/找到一种方法来控制元素放置的位置。我该如何添加额外的列?

非常感谢任何提示。

3个回答

15

使用带有指示器参数的合并,并重新映射结果:

m = {'left_only': 'df1', 'right_only': 'df2', 'both': 'df1, df2'}

result = df1.merge(df2, on=['A'], how='outer', indicator='B')
result['B'] = result['B'].map(m)

result
   A         B
0  a  df1, df2
1  b       df1
2  c       df2

太好了!你能否添加如何对交集进行相同操作?外->内? - Leon Rai
1
@LeonRai df1.merge(df2, on=['A'], how='inner').assign(B='df1, df2')(因为交集意味着两个数据框都有该值) - cs95
明白了!谢谢您详细的回答! - Leon Rai

3
使用以下命令:
df3 = pd.concat([df1.assign(source='df1'), df2.assign(source='df2')]) \
    .groupby('A') \
    .aggregate(list) \
    .reset_index()

结果将是:
   A      source
0  a  [df1, df2]
1  b       [df1]
2  c       [df2]
assign命令将在您的数据帧中添加一个名为source的列,并赋值为df1df2groupby命令将具有相同A值的行分组为单个行。 aggregate命令描述了如何聚合其他列(source)以获得具有相同A的一组行。我使用了list聚合函数,以便source列成为具有相同A值的值列表。

2
我们可以使用外连接来解决这个问题——"最初的回答"。
df1 = pd.DataFrame({'A':['a','b']})
df2 = pd.DataFrame({'A':['a','c']})
df1['col1']='df1'
df2['col2']='df2'
df=pd.merge(df1, df2, on=['A'], how="outer").fillna('')
df['B']=df['col1']+','+df['col2']
df['B'] = df['B'].str.strip(',')
df=df[['A','B']]
df

   A        B
0  a  df1,df2
1  b      df1
2  c      df2

pleasure Leon :) - cph_sto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接