Python SQL/Join Table/DataFrame位于一个表/数据帧中包含重复项的列上
我正在使用Python 3.7和SQL Server。 出于好奇,我想知道如何使用SQL和Pandas实现这一点,但我也欢迎只使用其中一个来回答 我试图从两个表/数据帧中获取数据,我认为最好的方法是将它们连接起来 表1的结构如下所示:Python SQL/Join Table/DataFrame位于一个表/数据帧中包含重复项的列上,python,sql-server,pandas,join,Python,Sql Server,Pandas,Join,我正在使用Python 3.7和SQL Server。 出于好奇,我想知道如何使用SQL和Pandas实现这一点,但我也欢迎只使用其中一个来回答 我试图从两个表/数据帧中获取数据,我认为最好的方法是将它们连接起来 表1的结构如下所示: item_id attr_id 0 1 a1_id 1 1 a2_id 2 2 a3_id 3 3 a2_id 4 3 a3_id 5
item_id attr_id
0 1 a1_id
1 1 a2_id
2 2 a3_id
3 3 a2_id
4 3 a3_id
5 3 a4_id
ATTRIBUTE_ID ATTRIBUTE_NAME
0 a1_id a1_name
1 a2_id a2_name
2 a3_id a3_name
3 a4_id a4_name
4 a5_id a5_name
5 a6_id a6_name
表2的结构如下所示:
item_id attr_id
0 1 a1_id
1 1 a2_id
2 2 a3_id
3 3 a2_id
4 3 a3_id
5 3 a4_id
ATTRIBUTE_ID ATTRIBUTE_NAME
0 a1_id a1_name
1 a2_id a2_name
2 a3_id a3_name
3 a4_id a4_name
4 a5_id a5_name
5 a6_id a6_name
我想要一个显示与一个项关联的所有属性名的输出,因此它应该有三列:“item_id”、“attr_id”和“attr_name”。它看起来像这样:
item_id attr_id attr_name
0 1 a1_id a1_name
1 1 a2_id a2_name
2 2 a3_id a3_name
3 3 a2_id a2_name
4 3 a3_id a3_name
5 3 a4_id a4_name
我想连接“attr\u id”和“ATTRIBUTE\u id”列上的两个表/数据帧。我面临的主要挑战是,表1的“attr_id”中有重复的值,而表2的“ATTRIBUTE_id”中只有唯一的值。是否可以在这些列上进行连接,以便表2中“ATTRIBUTE_NAME”列中的值在需要时重复,并与各自的属性ID正确关联?不确定这是否重要,但我会注意到表1的'attr_id'中的值只是表2的'ATTRIBUTE_id'中的值的子集。这里是涉及
内部联接的熊猫版本,其中表1
和表2
是示例中表的数据帧
pd.merge(表1,表2,左上class='attr\u id',右上class='ATTRIBUTE\u id')\
.drop(columns='ATTRIBUTE\u ID')\
.rename(列={'ATTRIBUTE_NAME':'attr_NAME'})\
.sort_值(按class='item_id')\
.reset_索引(drop=True)
输出
item_id attr_id attr_name
0 1 a1_id a1_name
1 1 a2_id a2_name
2 2 a3_id a3_name
3 3 a2_id a2_name
4 3 a3_id a3_name
5 3 a4_id a4_name
为了理智起见,尽可能加入数据库服务器。理论上,您可以通过返回属性表并在Pandas中进行匹配来保存I/O,但这仅在非常基本的情况下有效
这是一个非常简单的连接条件:
SELECT
item.item_id
,item.attr_id
,attr.attribute_name
FROM
item item
LEFT JOIN
attribute attr
ON attr.attribute_id = item.attr_id
由于没有数据模型或查看数据库,我不知道是否存在正确的外键关系,所以在本例中使用Left join。Balaji Ambresh和bbaird的回答都有助于回答我的问题。由于它们都只提供了我问题的部分答案,我不能将它们单独标记为已接受的答案。