繁体   English   中英

Pandas / sqlite3:更改部分熊猫数据框并替换为sqlite数据库

[英]Pandas / sqlite3: Change part of pandas dataframe and replace in sqlite database

专家们,

我正在努力寻找一种有效的方法来处理熊猫和sqlite。

我正在建立一个工具,让用户

  1. 根据一些过滤器提取一部分sql数据库(sub_table)
  2. 更改sub_table的一部分
  3. 将更改后的sub_table上传回整个sql表,替换旧值

用户将只能看到excel数据(因此我需要来回写到excel,这超出了我的示例范围)。

用户可以

  • 用新数据替换现有行(条目)
  • 删除现有行
  • 添加新行

问题: 如何使用Pandas / sqlite3最有效地执行“替换/删除/添加”操作?

这是我的示例代码。 如果我在df_sub.to_sql("MyTable", con = conn, index = False, if_exists="replace")使用df_sub.to_sql("MyTable", con = conn, index = False, if_exists="replace")而不是整个表都被替换了...那么肯定有另一种我无法想到的方法。

import pandas as pd
import sqlite3
import numpy as np


#### SETTING EXAMPLE UP

### Create DataFrame
data = dict({"City": ["London","Frankfurt","Berlin","Paris","Brondby"],
            "Population":[8,2,4,9,0.5]})
df = pd.DataFrame(data,index = pd.Index(np.arange(5)))

### Create SQL DataBase
conn = sqlite3.connect("MyDB.db")

### Upload DataFrame as Table into SQL Database
df.to_sql("MyTable", con = conn, index = False, if_exists="replace")

### Read DataFrame from SQL DB
query = "SELECT * from MyTable"
pd.read_sql_query(query, con = conn)

#### CREATE SUB_TABLE AND AMEND

#### EXTRACT sub_table FROM SQL TABLE
query = "SELECT * from MyTable WHERE Population > 2"
df_sub = pd.read_sql_query(query, con = conn)
df_sub

#### Amend Sub DF
df_sub[df_sub["City"] == "London"] = ["Brussel",4]
df_sub

#### Replace new data in SQL DB
df_sub.to_sql("MyTable", con = conn, index = False, if_exists="replace")
query = "SELECT * from MyTable"
pd.read_sql_query(query, con = conn)

谢谢你的帮助!

注意:我确实尝试通过纯SQL查询来实现,但是放弃了。 因为我不是SQL方面的专家,所以如果存在解决方案,我想与pandas一起使用。 如果没有关于如何通过sql实现的提示,那就太好了!

我认为无法使用SQL查询完成此任务。 使用熊猫,只能读取对DataFrame的查询并将DataFrame写入数据库(替换或追加)。

如果要更新特定的值/行或要删除行,则必须使用SQL查询。 您应该查看的命令例如:UPDATE,REPLACE,INSERT,DELETE

# Update the database, change City to 'Brussel' and Population to 4, for the first row 
# (Attention! python indices start at 0, SQL indices at 1)
cur = conn.cursor()
cur.execute('UPDATE MyTable SET City=?, Population=? WHERE ROWID=?',  ('Brussel', 4, 1))
conn.commit()
conn.close()

# Display the changes
conn = sqlite3.connect("MyDB.db")
query = "SELECT * from MyTable"
pd.read_sql_query(query, con=conn)

有关sql和pandas的更多示例,请查看https://www.dataquest.io/blog/python-pandas-databases/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM