Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQL/Join Table/DataFrame位于一个表/数据帧中包含重复项的列上_Python_Sql Server_Pandas_Join - Fatal编程技术网

Python SQL/Join Table/DataFrame位于一个表/数据帧中包含重复项的列上

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

我正在使用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        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的回答都有助于回答我的问题。由于它们都只提供了我问题的部分答案,我不能将它们单独标记为已接受的答案。