輸入是 2 個熊貓資料框 df1 & df2
df1
Document No Amount
6 8138000628REV 0.00
9 8138000602REV 0.00
24 8138000607REV 310.00
11 8138000605REV 0.00
14 813800602REV 0.00
45 8138000525AREV 0.00
84 8138000861REV 200000.00
87 8138000748REV -80770.82
df2
Document No Amount
2 8138000628 0.00
5 8138000602 0.00
12 8138000605 0.00
16 813800602 0.00
42 8138000525A 0.00
80 8138000861 215208.00
85 8138000748 80770.82
所需輸出基于“檔案編號”。對于 df1 中的每個“檔案編號”,如果 df2 中不存在“檔案編號”,則使其成為 df3 的一部分。如果 df2 中存在“檔案編號”并且 df1、df2 中的金額不同,則使用 df2 中沒有“REV”關鍵字的“檔案編號”使其成為 df3 的一部分,金額將是減法
df3
Document No Amount
24 8138000607 310.00
84 8138000861 15208.00 -->(215208.00-200000.00)
到目前為止,我已經嘗試使用下面的代碼片段使用字典和串列來實作我的目標,并且我能夠得到結果,但我假設 Pandas 確實有一些強大的能力來實作同樣的目標,而代碼行更少。如果有人可以給我一些提示并向我展示僅使用 Pandas 實作相同目標的路徑,那么我對 Pandas 不太熟悉。
%%time
import pandas as pd
Path_M='somepath'
df_led = pd.read_excel(Path_M 'ABC Ltd_ recon.xlsx',
usecols = ['Document No','Remaining Amount'],
sheet_name='Ledger')
df_led['combined']=df_led.values.tolist()
list1 = df_led['combined'].tolist()
thisdict_pir={}
for item in list1:
ll_pir=[]
key = item[0]
key=str(key)
if key.endswith('REV'):
if key in thisdict_pir:
var = thisdict_pir[key]
var.append(item)
thisdict_pir[key] = var
else:
ll_pir.append(item)
thisdict_pir[key]=ll_pir
listofdocnumberwithnorev=[]
for item in listofextdocno:
if item.endswith('REV'):
listofdocnumberwithnorev.append(item[:-3])
thisdict_pi={}
for extdocno in listofdocnumberwithnorev:
if extdocno in thisdict:
data=thisdict[extdocno]
thisdict_pi[extdocno]=data
listofextdocnoin=thisdict_pir.keys()
finaldict={}
for inv in listofextdocnoin:
listofpir=thisdict_pir[inv]
#print(listofpir)
if inv[:-3] in thisdict_pi:
listofpi=thisdict_pi[inv[:-3]]
#print(listofpi)
else:
listofpi=[]
print(listofpi)
if (len(listofpir)>0):
#print(listofpir)
amtinvr=0
for pinvr in listofpir:
amtinvr=pinvr[5] amtinvr
#print(amtinvr)
if (len(listofpi)>0):
#print(listofpi)
amtinv=0
for pinv in listofpi:
amtinv=pinv[5] amtinv
#print(amtinv)
if abs(amtinvr) != abs(amtinv):
val=pinvr
finaldict[inv]=val
elif len(listofpi)<1:
finaldict[inv]=pinvr
uj5u.com熱心網友回復:
您可以合并您的 2 個資料框,然后過濾掉。
df3 = (
df1.assign(**{'Document No': df1['Document No'].replace('REV$', '', regex=True)})
.merge(df2, how='left', on='Document No', indicator=True, suffixes=('', '2'))
.query("(_merge == 'left_only') | (Amount != -Amount2)")
.assign(Amount=lambda x: x['Amount2'].fillna(2*x['Amount']).sub(x['Amount']))
[['Document No', 'Amount']]
)
輸出:
>>> df3
Document No Amount
2 8138000607 310.0
6 8138000861 15208.0
更新
要保留df1(24, 84) 的索引,請使用此修改后的版本:
df3 = (
df1.assign(**{'Document No': df1['Document No'].replace('REV$', '', regex=True)})
.reset_index()
.merge(df2, how='left', on='Document No', indicator=True, suffixes=('', '2'))
.query("(_merge == 'left_only') | (Amount != -Amount2)")
.assign(Amount=lambda x: x['Amount2'].fillna(2*x['Amount']).sub(x['Amount']))
.set_index('index')[['Document No', 'Amount']].rename_axis(None)
)
輸出:
>>> df3
Document No Amount
24 8138000607 310.0
84 8138000861 15208.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412436.html
標籤:
上一篇:每個時間間隔的平均值
下一篇:在Plotly上繪制df行
