簡體   English   中英

在 pandas 中組合數據框以將貸方分配給借方

[英]Combine dataframes to allocate lenders to borrowers, in pandas

我有兩個數據框:貸方和借方。 我想結合從貸方到借方的價值,如下所示。

LenderDF = pd.DataFrame({
'LenderID':['Lender 1', 'Lender 2','Lender 3','Lender 4', 'Lender 5'],
'AmountHave': [300, 150, 500, 100, 200]
})
borrowerDF = pd.DataFrame({
'borrowerID': ['Borrower 1', 'Borrower 2','Borrower 3','Borrower 4'],
'AmountNeed': [100,200,150,300]
 })

print(LenderDF)
print(borrowerDF)

   LenderID  AmountHave
0  Lender 1         300
1  Lender 2         150
2  Lender 3         500
3  Lender 4         100
4  Lender 5         200

   borrowerID  AmountNeed
0  Borrower 1         100
1  Borrower 2         200
2  Borrower 3         150
3  Borrower 4         300

我試圖得到的最終 output 是:

   BorrowerID  AmountNeeded  LenderID  LenderHave(after lending amount)  RemainingAmount
0  Borrower 1           100  Lender 1                                     300              200
1  Borrower 2           200  Lender 1                                     200                0
2  Borrower 3           150  Lender 2                                     150                0
3  Borrower 4           300  Lender 3                                     500              200

例子:

  • 第一個貸方有 300 個,所以他們可以借錢給(比如說)借款人 1 和借款人 2:
  • 300 ( firstLender ) >= 100 ( firstBorrower 需要的金額)
  • 因此,將第一個貸方“貸方 1”的值分配或設置給取款的借款人,並將剩余值設置為200 AmountLenderHave 的第一個值將為 300,因為這是該人第一次借出金額。
  • 200(firstLender) >= 200 (secondBorrower 所需金額)

Likeise,迭代每個貸方行,依此類推,直到沒有貸方剩余。

我不認為使用 pandas 連接函數來做到這一點的好方法,這確實是一個問題,您應該遍歷借款人列表。 下面做你所追求的:

import pandas as pd

LenderDF = pd.DataFrame({
'LenderID':['Lender 1', 'Lender 2','Lender 3','Lender 4', 'Lender 5'],
'AmountHave': [300, 150, 500, 100, 200]
})
borrowerDF = pd.DataFrame({
'borrowerID': ['Borrower 1', 'Borrower 2','Borrower 3','Borrower 4'],
'AmountNeed': [100,200,150,300]
 })

lenders = LenderDF.to_dict(orient='records')
borrowers = borrowerDF.to_dict(orient='records')

for borrower in borrowers:
    # get next lender who can pay
    amount_needed = borrower['AmountNeed']
    lender = next(lender for lender in lenders if lender['AmountHave'] >= amount_needed)
    borrower['LenderID'] = lender['LenderID']
    borrower['LenderHave'] = lender['AmountHave']
    borrower['LenderRemaining'] = lender['AmountHave'] - amount_needed
    # Update lenders amount
    lender['AmountHave'] -= amount_needed


print(pd.DataFrame(borrowers))

   borrowerID  AmountNeed  LenderID  LenderHave  LenderRemaining
0  Borrower 1         100  Lender 1         300              200
1  Borrower 2         200  Lender 1         200                0
2  Borrower 3         150  Lender 2         150                0
3  Borrower 4         300  Lender 3         500              200

這是我的解決方案。 我也將 dataframe 轉換為列表。 此代碼還處理借款人必須從多個貸方借款的情況,如下例所示:

import pandas as pd
lenderDF = pd.DataFrame({
'LenderID':['Lender 1', 'Lender 2','Lender 3','Lender 4', 'Lender 5'],
'AmountHave': [300, 150, 500, 100, 200]
})
borrowerDF = pd.DataFrame({
'borrowerID': ['Borrower 1', 'Borrower 2','Borrower 3','Borrower 4'],
'AmountNeed': [100,300,150,300]
 })

lender_have = lenderDF["AmountHave"].tolist()
borrower_need = borrowerDF["AmountNeed"].tolist()

borrowerID = []
lenderID = []
borrower_remaining_need = [borrower_need[0]]
lender_before = [lender_have[0]]
lender_after = []
l = 0
b = 0
while b < len(borrower_need):
    borrowerID.append(f'Borrower {b + 1}')
    lenderID.append(f'Lender {l + 1}')
    remaining_funds = lender_before[-1] - borrower_remaining_need[-1]

    if remaining_funds > 0:
        lender_after.append(remaining_funds)
        lender_before.append(remaining_funds)
        b += 1
        if b< len(borrower_need):
            borrower_remaining_need.append(borrower_need[b])

    elif remaining_funds < 0:
        lender_after.append(0)
        borrower_remaining_need.append(borrower_remaining_need[-1] - lender_before[-1])
        if l+1 < len(lender_have):
            lender_before.append(lender_have[l+1])
        l += 1

    elif remaining_funds == 0:
        lender_after.append(0)
        if l+1 < len(lender_have):
            lender_before.append(lender_have[l+1])
        if b+1 < len(borrower_need):
            borrower_remaining_need.append(borrower_need[b+1])
        b += 1
        l += 1

if len(lender_before) > len(borrowerID):
    lender_before.pop()

result_df = pd.DataFrame({"BorrowrID": borrowerID, "Amount Needed": borrower_remaining_need,
                          "LenderID": lenderID, "Lender Before": lender_before, "Lender After":lender_after},)

print(result_df)

    BorrowrID  Amount Needed  LenderID  Lender Before  Lender After
0  Borrower 1            100  Lender 1            300           200
1  Borrower 2            300  Lender 1            200             0
2  Borrower 2            100  Lender 2            150            50
3  Borrower 3            150  Lender 2             50             0
4  Borrower 3            100  Lender 3            500           400
5  Borrower 4            300  Lender 3            400           100

暫無
暫無

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

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