在mysql查询中将pandas dataframe作为参数传递

2024-07-08 15:14:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧df,看起来像:

df = pd.DataFrame({'SEC1':['IBM','CSCO','MSFT','AMZN' ], 'SEC2':['GOOG', 'INTC', 'ABX', 'CREE'], 'HOUR':[10 ,10 ,15, 12], 'Size':[100 ,200 ,50 ,500],'Price':[300 ,25 ,150, 80] })

df = df[['SEC1', 'SEC2', 'HOUR', 'Size', 'Price']]

我有一个大的mysql表(name=table-B),我想用dataframe对它进行左连接。我一直在阅读pandas的文档,但我不清楚如何在不首先将table-B读入数据帧的情况下完成这项工作。我不想把一个巨大的表加载到pandas中,然后左连接到df,这将返回table-B中的一小部分行。有没有方法在read_sql中将dataframe df作为对象/参数传递。在

如果我在mysql中执行此操作,代码将如下所示,其中Table-A是我上面的数据帧:

^{pr2}$

Tags: 数据dataframepandasdfsizemysqltableibm
1条回答
网友
1楼 · 发布于 2024-07-08 15:14:18

可以使用^{}df加载到数据库表中:

df.to_sql(tablename, engine, if_exists='replace')

然后在数据库中执行联接,并使用^{}将结果读入新的数据帧:

^{pr2}$

例如,使用SQLAlchemy:

import pandas as pd
import sqlalchemy as SA
import config

df = pd.DataFrame({'SEC1':['IBM','CSCO','MSFT','AMZN' ], 'SEC2':['GOOG', 'INTC', 'ABX', 'CREE'], 'HOUR':[10 ,10 ,15, 12], 'Size':[100 ,200 ,50 ,500],'Price':[300 ,25 ,150, 80] })
df = df[['SEC1', 'SEC2', 'HOUR', 'Size', 'Price']]

engine = SA.create_engine('mysql+oursql://{u}:{p}@{h}/{d}'.format(
    u=config.USER, p=config.PASS, h=config.HOST, d='test'))
tablename = 'Table-A'
df.to_sql(tablename, engine, if_exists='replace')

sql = '''select * from  Table-A a
         left join Table-B b
         on (a.sec1 = b.sec1)
         where DATE_SUB(CURDATE(),INTERVAL 12 MONTH) <= dt
         group by 1,2,3,4,5,6,7'''

result = pd.read_sql(sql, engine)

相关问题 更多 >

    热门问题