首先,我了解我想实现的目标可以使用pandas dataframe.concat()完成。但是,由于大量数据,计算机内存有时会崩溃。因此,我尝试通过sqlalchemy将那些表保存到db中来实现多表联接。 我将通过下面的简单示例来说明我的目标。
表:案例0
表:案例1
我想通过python sqlalchemy查询(不 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是否可以将与表名相关的元数据作为元组包含在其中,以便以后可以轻松地转移到熊猫的多级列中?
答案 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'])
我希望这能回答您的问题