我需要连接到现有的 SQLite 数据库,将键列的值与数据框中的值进行比较。对于数据库和数据框之间的每个键匹配,更新该行中特定列的值。如果数据框中存在键,但数据库中不存在,则将相应的行附加到数据库。目标是相对较大的数据集,因此内存使用和性能是一个问题(可以是 20-60 gb db,@ ~20 列和数百万行)。
我之前曾尝试将数据库读入数据帧并在内存中合并新旧数据帧,但事实证明这很昂贵(通常 5 gig 数据集会在内存中增长到 20 gig)。
我在这里迷失了逻辑,这是我走得最远的地方:
def update_column(tablename, key_value):
c.execute('SELECT key FROM {}'.format(tablename))
for row in c.fetchall():
# populating this key value per row is challenging for me
if row == key_value:
c.execute('UPDATE {} SET last_seen = {} WHERE UUID = {}}'.format(tablename, hunt_date, key_value))
else:
df.to_sql(table_name, if_exists='append')
for index, row in reader.iterrows():
key_value = row['key']
update_column(tablename, key_value)
示例数据集:
数据库
Key First_Seen Last_Seen Data1 Data2
Bigfoot 2015 2015 Blah Blah
Loch_Ness 2016 2016 Blah Blah
UFO 2016 2004 Blah Blah
带有新数据的数据框:
Key First_Seen Last_Seen Data Data
UFO 2017 2017 Blah Blah
Tupac 2017 2017 Blah Blah
数据库中的期望输出:
Key First_Seen Last_Seen Data Data
Bigfoot 2015 2015 Blah Blah
Loch_Ness 2016 2016 Blah Blah
UFO 2016 2017 Blah Blah
Tupac 2017 2017 Blah Blah
最佳答案
我会在 SQLite 端进行这样的更新。
首先将您的 DF 保存为临时 SQLite 表:tmp
:
df.to_sql('tmp', conn, if_exists='replace')
sql = """
UPDATE table_name set last_seen = (SELECT t.last_seen
FROM tmp t
WHERE t.Key = table_name.key)
WHERE EXISTS(
SELECT *
FROM tmp
WHERE tmp.key = table_name.key
)
"""
c.execute(sql)
关于python - 使用条件更改列值或附加新行的数据框更新 SQLite DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46258830/