根据列值合并两个数据框

0 投票
1 回答
30 浏览
提问于 2025-04-14 16:00

我有两个数据框

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

撰写回答