2017-02-25 4 views
1

Ich habe eine SQLite-Datenbank mit den folgenden Spalten und 1000 ZeilenPandas Datenrahmen mit SQLite-Tabelle über sqlquery

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

Vergleich möchte ich eine pandas.Dataframe mit diesem table, und wenn der Wert in der Spalte vergleichen sqlite "Code"ist nicht in df['Code'], dann Update sqlite "Buy" mit dem Wort "Ja".

Zunächst habe ich versucht, den Code unten zu sehen, ob ich alle Ergebnisse von df['Code'] bekommen zu drucken, wenn es vorhanden ist, dann könnte ich in einem NOT in den sqlite query fügen Sie einfach die Ergebnisse leicht zu schlagen, aber zur Zeit, den Code unten druckt 1000 Zeilen von leeren Listen und druckt gelegentlich statt, einige der Code aus ...

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) 

Nicht sicher, wo mein Fehler liegt? Ich dachte daran, dies auf Datenbankebene zu tun, da es schneller sein könnte.

Antwort

0

Angenommen, wir folgende SQLite Tabelle haben:

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

und die folgende DF:

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

ich es in der folgenden Art und Weise tun würde:

erster DF in den Speicher dieselbe SQLite-Datei mit einem anderen Tabellennamen:

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

Ergebnis (SQLite):

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

jetzt können wir effizient unsere tab Tabelle direkt in der SQLite aktualisieren:

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 

Natürlich können Sie den letzten Schritt in Python tun können:

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()