合并数据框Python,无需重复

时间:2018-09-24 13:16:39

标签: python pandas merge

我有两个数据框df1df2,我想将它们合并。

数据帧df1如下:

   IDs          Value1      Value2       
   AB              1          3
   AB              1          1
   AB              2          4           
   BC              2          2
   BC              5          0         
   BG              1          1         
   RF              2          2

和数据帧df2如下:

   IDs          Issue     
   AB              AA
   AB              AAA
   AB              BA
   BC              CC
   BC              CA    
   BG              A        
   RF              D

,期望的输出为df3

   IDs          Value1      Value2        Issue     
   AB              1          3             AA
   AB              1          1             AAA
   AB              2          4             BA
   BC              2          2             CC
   BC              5          0             CA
   BG              1          1             A
   RF              2          2             D

当前,以下内容:

df3 = pd.merge(df1,df2,left_on='IDs',right_on='IDs',how='inner')
df3 = pd.merge(df1,df2,left_on='IDs',right_on='IDs',how='left')
df3 = pd.merge(df1,df2,left_on='IDs',right_on='IDs',how='outer')

不起作用,因为它们产生的结果类似于以下内容:

   IDs          Value1      Value2        Issue     
   AB              1          3             AA
   AB              1          1             AA
   AB              2          4             AA
   BC              2          2             CC
   BC              5          0             CC
   BG              1          1             A
   RF              2          2             D

表示它们复制了Issuedf2字段的第一个值。

2 个答案:

答案 0 :(得分:4)

在两个DataFrame中将cumcount用于计数器列,并将此列添加到on中的参数merge中:

df1['g'] = df1.groupby('IDs').cumcount()
df2['g'] = df2.groupby('IDs').cumcount()

df3 = pd.merge(df1,df2,on=['IDs', 'g']).drop('g', axis=1)
print (df3)
  IDs  Value1  Value2 Issue
0  AB       1       3    AA
1  AB       1       1   AAA
2  AB       2       4    BA
3  BC       2       2    CC
4  BC       5       0    CA
5  BG       1       1     A
6  RF       2       2     D

详细信息

print (df1)
  IDs  Value1  Value2  g
0  AB       1       3  0
1  AB       1       1  1
2  AB       2       4  2
3  BC       2       2  0
4  BC       5       0  1
5  BG       1       1  0
6  RF       2       2  0

print (df2)
  IDs Issue  g
0  AB    AA  0
1  AB   AAA  1
2  AB    BA  2
3  BC    CC  0
4  BC    CA  1
5  BG     A  0
6  RF     D  0

答案 1 :(得分:2)

您可以使用pd.concat来按数据帧的索引逐字连接。这意味着您必须对两个数据框进行预排序,而您只需将一个数据框“粘贴”到另一个数据框旁即可。

pd.concat([df1, df2[['Issue']], axis=1)

输出:

  IDs  Value1  Value2 Issue
0  AB       1       3    AA
1  AB       1       1   AAA
2  AB       2       4    BA
3  BC       2       2    CC
4  BC       5       0    CA
5  BG       1       1     A
6  RF       2       2     D