pandas 使用DataFrame模拟复杂的SQL语句

u91tlkcl  于 2023-02-02  发布在  其他
关注(0)|答案(1)|浏览(111)

离开几年后,我又回到了Python,我正在用Python重写一个旧的msAccess预算程序,特别是使用 Dataframe 。
有一个名为“A”的表(可能非常大),其中包含支出历史记录。表B是一个包含必须添加到表A的最近支出快照的表。但是,请注意,表B可能包含A中已有的重复项。我需要做的是查找表B中不在A中的条目,然后将它们附加到A。
在Access程序中,使用了以下msaccess SQL查询:

SELECT A.Date, A.Item, A.Debit, A.Credit, A.Balance, A.Description
FROM A LEFT JOIN B
ON(A.Date=B.Date) AND(A.Item=B.Item) AND(A.Balance=B.Balance)
WHERE(((B.Date) Is Null)) Or(((B.Item) Is Null)) Or(((B.Balance) Is Null))

然后将结果加到A中,一次加一个。
我怎么能用 Dataframe 来代替呢?我试过不同的合并技术,都没有成功。
以下是2个示例 Dataframe (数据已修改,不真实)

dfA = pd.DataFrame({
    'Date': ['2023-01-25', '2023-01-24', '2023-01-24', '2023-01-23'],
    'Item': ['Visa Purchase 21Jan Hanaro Northlakes    Mango Hil    ',
             'Visa Purchase 21Jan Event Cinemas North  North Lak',
             'Visa Purchase 21Jan Event Cinemas North  North Lak',
             'Mcare Benefits 4880000027 Eywq'],
    'Debit': [67.0, 10.2, 7.65, 39.75],
    'Credit': [0.0, 0, 0, 0],
    'Balance': [1830.0, 1897.99, 1908.019, 1915.84],
    'Description': ['a', 'b', 'c', 'd']
})

dfB = pd.DataFrame({
    'Date': ['2023-01-23', '2023-01-23', '2023-01-23', '2023-01-23'],
    'Item': ['Csc R555558Df Nett',
             'Tfr Wdl BPAY Internet 25Jan05:31 208655638973732700058Deft Payments',
             'Eftpos Debit 25Jan15:19 Sq *Becs Cafe Kippa-Ring   Qldau',
             'Mcare Benefits 4880000027 Eywq'],
    'Debit': [0, 168.0, 9.0, 39.75],
    'Credit': [907.92, 0, 0, 0],
    'Balance': [2053.09, 1885.07, 1876.09, 1915.84],
    'Description': ['z', 'x', 's', 'f']})

print(f"A\n {dfA.head()}")
print(f"\nB\n {dfB.head()}")

(The这里的日期数据是一个字符串,但在我的程序中,它们都是日期类型)
任何帮助都将不胜感激

gzszwxb4

gzszwxb41#

IIUC,你只需要从dfB添加新的行到dfA,这些行不是重复的。我认为这很简单。在你的例子中,这从dfB中删除了1行,所以newdf现在是7行。

newdf = pd.concat([dfA, dfB]).drop_duplicates(subset=['Date', 'Item', 'Balance'], keep='first').reset_index(drop=True)

相关问题