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
数据帧df2df2
如下所示:
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
列中的一些空格有问题。非常感谢。