![](/img/trans.png)
[英]Value calculation based on date in DataFrame in Python Pandas?
[英]Python - Pandas 2 dataframe calculation based on column value
輸入為 2 pandas Dataframe 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
所需的 Output 基於“文檔編號”。 對於 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
您可以合並您的 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']]
)
Output:
>>> 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)
)
Output:
>>> df3
Document No Amount
24 8138000607 310.0
84 8138000861 15208.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.