【问题标题】:comparing pandas dataframe with sqlite table via sqlquery通过 sqlquery 将 pandas 数据框与 sqlite 表进行比较
【发布时间】:2017-07-16 01:26:29
【问题描述】:

我有一个包含以下列和 1000 行的 sqlite 数据库

con.execute('CREATE TABLE "table" (Fruit TEXT, Texture TEXT, Code TEXT, Buy TEXT )'

我想将pandas.Dataframe 与此table 进行比较,如果sqlite "Code" 列中的值不在df['Code'],则将sqlite "Buy" 更新为“是的”。

最初我尝试使用以下代码查看是否可以从df['Code'] 获取所有结果以打印它是否存在,然后我可以将NOT 添加到sqlite query 以翻转结果,但是目前,下面的代码打印出 1000 行空列表,偶尔会打印出一些 Code 代替...

for each_code in df['Code']:
    z = con.execute('SELECT EXISTS(SELECT 1 FROM "table" WHERE Code IN ({c}))'
                     .format(c=each_code)).fetchall()
    print(z)

不确定我的错误在哪里?我想在数据库级别执行此操作,因为它可能会更快。

【问题讨论】:

    标签: python sqlite pandas


    【解决方案1】:

    假设我们有以下 SQLite 表:

    sqlite> select * from tab;
    Fruit       Texture     Code        Buy
    ----------  ----------  ----------  ----------
    apple                   code1
    orange                  code2
    mango                   code3
    banana                  code4
    peach                   code5
    

    以及以下DF:

    In [37]: df
    Out[37]:
        Code
    0  code1
    1  code3
    2  code5
    3  code7
    

    我会这样做:

    首先将 DF 保存到同一个 SQLite 文件中,但表名不同:

    import sqlite3    
    con = sqlite3.connect('d:/temp/a.db')    
    df.to_sql('tmp', con, index=False)
    

    结果(SQLite):

    sqlite> select * from tmp;
    Code
    ----------
    code1
    code3
    code5
    code7
    

    现在我们可以直接在 SQLite 中高效地更新 tab 表:

    sqlite> update tab set buy='Yes' where not exists (select 1 from tmp where tmp.code=tab.code);
    sqlite> select * from tab;
    Fruit       Texture     Code        Buy
    ----------  ----------  ----------  ----------
    apple                   code1
    orange                  code2       Yes
    mango                   code3
    banana                  code4       Yes
    peach                   code5
    

    当然你可以在 Python 中完成最后一步:

    con.execute("update tab set buy='Yes' where not exists (select 1 from tmp where tmp.code=tab.code)")
    # optional clean up
    con.execute("drop table tmp")
    con.commit()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      相关资源
      最近更新 更多