我有两个数据框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
和数据帧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
表示它们复制了Issue
中df2
字段的第一个值。
答案 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