Python 在不重复的情况下合并数据帧

Python 在不重复的情况下合并数据帧,python,pandas,merge,Python,Pandas,Merge,我有两个数据帧df1和df2,我想合并它们 数据帧df1如下所示: IDs Value1 Value2 AB 1 3 AB 1 1 AB 2 4 BC 2 2 BC 5 0

我有两个数据帧
df1
df2
,我想合并它们

数据帧
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
   IDs          Issue     
   AB              AA
   AB              AAA
   AB              BA
   BC              CC
   BC              CA    
   BG              A        
   RF              D
数据帧df2
df2
如下所示:

   IDs          Value1      Value2       
   AB              1          3
   AB              1          1
   AB              2          4           
   BC              2          2
   BC              5          0         
   BG              1          1         
   RF              2          2
   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
这意味着它们从
df2

复制
问题
字段的第一个值,用于
数据帧
中的计数器列,并将此列添加到
合并
中上的参数

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
用于
数据帧
s中的计数器列,并将此列添加到
合并
上的参数

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

您可以使用
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

您可以使用
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

这个解决方案似乎不起作用。我一直得到与上述问题完全相同的问题。@user37143-真的很有趣,对我来说它工作得很好。@user37143-添加了列
g
-对于重复的值是递增的整数-你能检查一下吗?@jezrael是的,这也是我的输出,但是连接仍然会把事情搞砸,返回第一次出现的“问题”duplicated@user37143-它应该可以工作,可能是
ids
列中的一些空格有问题。谢谢。这个解决方案似乎不起作用。我一直得到与上述问题完全相同的问题。@user37143-真的很有趣,对我来说它工作得很好。@user37143-添加了列
g
-对于重复的值是递增的整数-你能检查一下吗?@jezrael是的,这也是我的输出,但是连接仍然会把事情搞砸,返回第一次出现的“问题”duplicated@user37143-它应该可以工作,可能是
ids
列中的一些空格有问题。非常感谢。