python - 使用条件更改列值或附加新行的数据框更新 SQLite DB

标签 python sqlite pandas

我需要连接到现有的 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/

相关文章:

java - 我为本地 sqlite 数据库创建了应​​用程序,但它没有运行。请告诉我解决方案

python - Pyspark drop_duplicates(keep=False)

mysql - 为什么 SELECT 结果在 mysql 和 sqlite 之间不同?

python - 在 Django 的 settings.py 中导入模型

android - 在 Android 中,从字符串数组填充 SQLite 数据库表

python - 在 Pandas 数据框中的 2 个日期之间添加日期列

python - 如何在Python中基于另一个数据框更改整个数据框值

python - 从 .csv 文件获取数据

javascript - 本地应用程序之间的安静通信是一个好主意吗?

python - 列出当前 Python 解释器中所有已知的 NumPy 数组