簡體   English   中英

從數據框更新PostgreSQL中表空值的最快方法

[英]Fastest way to update table nulls in postgresql from dataframe

我有一個熊貓數據框和匹配的postgresql表,其中的每個單元格都為null或時間戳。 對於表中單元格值等於null且對應的數據幀單元格值為時間戳的每個單元格,我想更新表單元格值。 最快的方法是什么?

目前,我將整個表放入一個數據框,在python中逐個單元比較兩個數據框,將這些值輸入第三個數據框(稱為DFC),然后銷毀舊表並從中構建新表DFC。 這似乎效率低下。

例:

**Data Frame**   **Postgres Table**
     A    B           A    B
1   NaN   5      1   NaN  NaN
2    8   NaN     2    7   NaN



**Goal State Postgres Table**
     A    B
1   NaN   5
2    7   NaN

當前代碼:

import pandas as pd
from pandas import DataFrame

d = {'A': ['None', 8], 'B': [5, 'None']}
df = pd.DataFrame(data=d)
out = {'A': ['None', 'None'], 'B': ['None', 'None']}
outdf = pd.DataFrame(data=out)
tbl = pd.read_sql_query('select * from "exampletable"',con=engine)
for i, row in df.iterrows():
    for j in ['A', 'B']:
        if df.at[i, j] != 'None' and tbl.at[i, j] == 'None':
            outdf.at[i, j] = df.at[i, j]
        else:
            outdf.at[i, j] = tbl.at[i, j]
df.to_sql('exampletable', engine, if_exists='replace')
print(outdf.to_string())

IIUC,您可以合並兩個數據庫,但要保留每個數據庫的記錄。 然后,您可以檢查A列是否為空,並用df2中的B填充B列。

outdf = df1.join(df2, on=columns, how="outer", rsuffix='_df2', lsuffix='_df1')
outdf['B'] = outdf.apply(lambda x: x['B_df2'] if pd.isnull(x['A']), axis=1)

編輯 :您想回溯到不同的行。

outdf = outdf.loc[:, [columns with _df1 suffix]]
outdf.columns = [i.replace('_df1', '') for i in columns]
outdf = outdf.sort_values(by='B')
outdf = outdf.drop_duplicates([columns you're not filling in], keep='first')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM