[英]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.