基于主题id合并两个dataframe



我有两个定义为:

dataframe1 = pd.DataFrame( [[123, "ABC", "DEF", "GHI"],
[123, "ABC", "DEF", "GHI"],
[123, "ABC", "DEF", "GHI"],
[456, "JKL", "MNO", "PQR"],
[456, "JKL", "MNO", "PQR"],
[456, "JKL", "MNO", "PQR"]],
columns=["ID",
"Attr1", "Attr2", "Attr3"],
)
dataframe2 = pd.DataFrame( [["1", "A", 123],
["2", "A", 123],
["1", "C", 456],
["1", "B", 456],
["2", "B", 123],
["2", "C", 456]],
columns=["ROW","LOCATION","ID"],
)

我想根据ID号合并这两个数据框。我已经尝试合并函数

pd.merge(dataframe1,dataframe2, on = 'ID')

然而,这并没有产生我想要的结果。我想要一个与原始数据具有相同维数的输出

ID ROW LOCATION Attr1 Attr2 Attr3
0  123   1        A   ABC   DEF   GHI
1  123   2        A   ABC   DEF   GHI
2  123   2        B   ABC   DEF   GHI
3  456   1        B   JKL   MNO   PQR
4  456   1        C   JKL   MNO   PQR
5  456   2        C   JKL   MNO   PQR

这是你想要得到的吗?

df_merge = pd.merge(dataframe1, dataframe2, on = ['ID']).drop_duplicates(ignore_index = True)
df_merge[['ID', 'ROW', 'LOCATION', 'Attr1', 'Attr2', 'Attr3']]

为了得到您想要的结果,您可以对每个数据框(在IDdataframe2上以及在LOCATIONROW上)进行排序,然后使用concat在它们的索引上水平连接它们,从dataframe1中删除ID列:

df1 = dataframe1.sort_values(['ID']).reset_index(drop=True)
df2 = dataframe2.sort_values(['ID', 'LOCATION', 'ROW']).reset_index(drop=True)
pd.concat([df2,df1.drop('ID', axis=1)], axis=1)

输出:

ROW LOCATION   ID Attr1 Attr2 Attr3
0   1        A  123   ABC   DEF   GHI
1   2        A  123   ABC   DEF   GHI
2   2        B  123   ABC   DEF   GHI
3   1        B  456   JKL   MNO   PQR
4   1        C  456   JKL   MNO   PQR
5   2        C  456   JKL   MNO   PQR

虽然确切的逻辑不清楚,但看起来您希望按照重复项的顺序进行合并。

您可以添加一个辅助键:

(dataframe1
.assign(ID2=lambda d: d.groupby('ID').cumcount())
.merge(dataframe2.assign(ID2=lambda d: d.groupby('ID').cumcount()),
on=['ID', 'ID2'])
)

输出:

ID Attr1 Attr2 Attr3  ID2 ROW LOCATION
0  123   ABC   DEF   GHI    0   1        A
1  123   ABC   DEF   GHI    1   2        A
2  123   ABC   DEF   GHI    2   2        B
3  456   JKL   MNO   PQR    0   1        C
4  456   JKL   MNO   PQR    1   1        B
5  456   JKL   MNO   PQR    2   2        C

最新更新