【问题标题】:Sqlalchemy join table query to get column names equalized as multi-level columnsSqlalchemy 连接表查询以将列名均衡为多级列
【发布时间】:2019-07-07 02:18:50
【问题描述】:

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

表格:案例0

表格:案例1

我想要通过 python sqlalchemy 查询(NOT pandas)实现类似这样的目标:

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 是否能够将相关表名作为一个元组包含到每个列中,以便以后可以轻松地转移到 pandas 中的多级列?

【问题讨论】:

    标签: python dataframe sqlalchemy


    【解决方案1】:

    如果我们将 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'])
    

    我希望这能回答你的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      相关资源
      最近更新 更多