簡體   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