我有两个定义为:
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']]
为了得到您想要的结果,您可以对每个数据框(在ID
和dataframe2
上以及在LOCATION
和ROW
上)进行排序,然后使用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