使用成对的索引键连接两个数据框

时间:2019-02-06 17:43:12

标签: python pandas pandas-join

我有两个数据框,从中我确定了匹配的候选对象,以合并在一起成为一个数据框。每个原始数据帧都有其自己的索引,并且索引彼此不对应(并且没有其他要合并的列)。但是,我有一个成对的索引数组,指示应该将哪些单独的记录对连接在一起。我无法找到任何类型的https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html合并资源。

我想出的方法又笨又慢,我敢肯定有更好的方法。

import numpy as np
import pandas as pd

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                    index=[4, 5, 6, 7])

# The array of paired index keys
matches = np.array([(3,4),
                   (1,5),
                   (0,6),
                   (2,7)])

keys = {i[0]: i[1] for i in matches}

merged = pd.DataFrame()
for key, value in keys.items():
    left = df1.loc[[key]].reset_index()
    right = df2.loc[[value]].reset_index()

    together = pd.concat([left, right], axis = 1)
    merged = merged.append(together)

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作,使用reindex根据匹配对数据帧进行排序,然后使用reset_indexpd.concat数据帧:

d1 = df1.reindex(matches[:,0]).reset_index()
d2 = df2.reindex(matches[:,1]).reset_index()

pd.concat([d1,d2], axis=1)

输出:

   index   A   B   C   D  index   A   B   C   D
0      3  A3  B3  C3  D3      4  A4  B4  C4  D4
1      1  A1  B1  C1  D1      5  A5  B5  C5  D5
2      0  A0  B0  C0  D0      6  A6  B6  C6  D6
3      2  A2  B2  C2  D2      7  A7  B7  C7  D7

答案 1 :(得分:1)

如果您不希望数据框中的index个命名列,将成对索引数组转换为字典并使用rename函数也是一种方法:

matches = {3:4,1:5,0:6,2:7}
print(pd.concat([df1.rename(index=matches),df2],
                axis=1))

但是,如果您想将matches声明为np.array,则上述代码可以解决问题:

matches = np.array([(3,4),
                   (1,5),
                   (0,6),
                   (2,7)])
print(pd.concat([df1.rename(index=dict(matches)),df2], axis=1))

在两种情况下,输出均为:

    A   B   C   D   A   B   C   D
4  A3  B3  C3  D3  A4  B4  C4  D4
5  A1  B1  C1  D1  A5  B5  C5  D5
6  A0  B0  C0  D0  A6  B6  C6  D6
7  A2  B2  C2  D2  A7  B7  C7  D7