SQLAlchemy联接表查询以获取等同于多级列的列名

时间:2019-07-04 02:41:56

标签: python dataframe sqlalchemy

首先,我了解我想实现的目标可以使用pandas dataframe.concat()完成。但是,由于大量数据,计算机内存有时会崩溃。因此,我尝试通过sqlalchemy将那些表保存到db中来实现多表联接。 我将通过下面的简单示例来说明我的目标。

表:案例0

enter image description here

表:案例1

enter image description here

我想通过python sqlalchemy查询( pandas)实现以下目的: enter image description here

import pandas as pd 

lst1 = ['Apple', 'Banana'] 
lst2 = ['Pink', 'Yellow'] 
lst3 = [1.1,1.8]  
lst4 = [1.0,1.2] 
case0 = pd.DataFrame(list(zip(lst1, lst2,lst3,lst4)), 
               columns =['Fruit', 'Color','shot1','shot2']) 

lst5 = ['Apple', 'Orange'] 
lst6 = ['Pink', 'Orange'] 
lst7 = [1.1,1.5]  
lst8 = [1.0,1.3] 
case1 = pd.DataFrame(list(zip(lst5, lst6,lst7,lst8)), 
               columns =['Fruit', 'Color','shot1','shot2']) 

sqlalchemy是否可以将与表名相关的元数据作为元组包含在其中,以便以后可以轻松地转移到熊猫的多级列中?

1 个答案:

答案 0 :(得分:0)

如果我们将Case0重命名为First,将Case1重命名为Second-我不确定SQL是否可以处理表名中的数字,这听起来像是可以保证使用以下SQL:

-- use coalesce to fill out the column if it is not present in first
SELECT coalesce(first.fruit, second.fruit) as fruit,
       coalesce(first.color, second.color) as color,
       first.shot1 as case1_shot1,
       first.shot2 as case1_shot2,
       second.shot1 as case2_shot1,
       second.shot2 as case2_shot2
FROM first
FULL OUTER JOIN second
  ON first.fruit = second.fruit
  AND first.color = second.color

您也可以使用SQLAlchemy构造它:

session.query(
    func.coalesce(First.fruit, Second.fruit),
    func.coalesce(First.color, Second.color),
    First.shot1,
    First.shot2,
    Second.shot1,
    Second.shot2
).select_from(First).outerjoin(
    Second,
    (First.fruit == Second.fruit) & (First.color == Second.color),
    full=True
)

由于SQLAlchemy将结果集作为元组返回,因此是否命名它们都没有关系,但是由于显式设置了顺序,因此可以在将它们加载到DataFrame中时命名它们。

df = pd.DataFrame(query.all(), columns=['Fruit', 'Color', 'case1shot1', 'case1shot2', 'case2shot1', 'case2shot2'])

我希望这能回答您的问题