我有两个数据框,从中我确定了匹配的候选对象,以合并在一起成为一个数据框。每个原始数据帧都有其自己的索引,并且索引彼此不对应(并且没有其他要合并的列)。但是,我有一个成对的索引数组,指示应该将哪些单独的记录对连接在一起。我无法找到任何类型的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)
答案 0 :(得分:2)
您可以执行以下操作,使用reindex
根据匹配对数据帧进行排序,然后使用reset_index
和pd.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