两个熊猫DataFrames的并集

时间:2019-01-22 19:32:27

标签: python pandas dataframe merge concatenation

说我有两个数据帧:

df1:

  A
0 a
1 b

df2:

  A
0 a
1 c

我希望结果为两个框架的 union ,其中额外的列显示该行所属的源数据框架。如果出现重复,则应删除重复项,相应的额外列应同时显示两个来源:

  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 个答案:

答案 0 :(得分:12)

indicator参数合并,然后重新映射结果:

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

答案 1 :(得分:2)

使用以下命令:

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和值df1的列df2groupby命令将具有相同A值的行分组为单行。 aggregate命令描述了如何为每个具有相同source的行集合聚合其他列(A)。我使用了list聚合函数,因此source列是具有相同A的值的列表。

答案 2 :(得分: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