根据列值合并两个数据框
我有两个数据框
data1 = {'ID': [385908, 385909, 757947, 757946],
'A': ['LH', 'LH', 'LH', 'LH'],
'F': [646, 646, 646, 646],
'Orig': ['FRA', 'FRA', 'NQZ', 'NQZ'],
'Dest': ['NQZ', 'NQZ', 'ALA', 'ALA'],
'DayU': [1, 6, 1, 6],
'DepU': [650, 650, 1130, 1130]}
data2 = {'A': ['LH', 'LH', 'LH', 'LH', 'LH', 'LH'],
'F': [646, 646, 646, 646, 646, 646],
'Orig2': ['FRA', 'FRA', 'FRA', 'FRA', 'NQZ', 'NQZ'],
'Dest2': ['ALA', 'ALA', 'NQZ', 'NQZ', 'ALA', 'ALA'],
'DayL': [1, 6, 1, 6, 2, 7],
'DepL': [710, 710, 710, 710, 50, 50],
'IDL1': [385908, 385909, 385908, 385909, 757947, 757946],
'IDL2': [757947, 757946, -1, -1, -1, -1]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
我想根据 IDL1、IDL2 和 ID 的值,把 df2 的列添加到 df1 中。
当 ID 等于 IDL1 或 IDL2 时,我想把 Orig2 和 Dest2 添加到 df1 里。预期的结果是这样的:在这个例子中,前两行的 ID 是 IDL1,最后两行的 ID 是 IDL2。
data3 = {'ID': [385908, 385909, 757947, 757946],
'A': ['LH', 'LH', 'LH', 'LH'],
'F': [646, 646, 646, 646],
'Orig': ['FRA', 'FRA', 'NQZ', 'NQZ'],
'Dest': ['NQZ', 'NQZ', 'ALA', 'ALA'],
'DayU': [1, 6, 1, 6],
'DepU': [650, 650, 1130, 1130],
'Orig2':['FRA','FRA','FRA','FRA'],
'Dest2':['ALA','ALA','ALA','ALA'],
'DayL': [1, 6, 1, 6]}
}
这是一个简化的解决方案,我想要一个更通用的解决方案。谢谢
补充说明:我想把 df1 和 df2 合并,这样如果 df1 中的某一行 ID 和 df2 中的 IDL1 或 IDL2 匹配,并且 df1 中的 Orig 和 Dest 的组合与 df2 中的 Orig2 和 Dest2 的组合不同,就可以合并。
比如说,对于 ID 等于 757947 的情况,Orig 是 FRA,Dest 是 NQZ,我有多个匹配项,IDL2=757947 对应 (Orig2=FRA 和 Dest2=ALA),还有 IDL2=757947 对应 (Orig2=FRA 和 Dest=NQZ)。在这种情况下,我只在 Orig2+Dest2 不等于 Orig+Dest 时进行匹配。
1 个回答
1
代码
tmp = df2.melt(['Orig2', 'Dest2', 'DayL'], value_vars=['IDL1', 'IDL2'], value_name='ID')
tmp2 = df1.merge(tmp.drop('variable', axis=1), how='left')
out= tmp2[tmp2['Orig'].ne(tmp2['Orig2']) | tmp2['Dest'].ne(tmp2['Dest2'])]
输出
ID A F Orig Dest DayU DepU Orig2 Dest2 DayL
0 385908 LH 646 FRA NQZ 1 650 FRA ALA 1
2 385909 LH 646 FRA NQZ 6 650 FRA ALA 6
5 757947 LH 646 NQZ ALA 1 1130 FRA ALA 1
7 757946 LH 646 NQZ ALA 6 1130 FRA ALA 6