繁体   English   中英

在 Pandas 中组合数据框以将贷方分配给借方

Combine dataframes to allocate lenders to borrowers, in pandas

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有两个数据框:贷方和借方。 我想结合从贷方到借方的价值,如下所示。

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

我试图获得的最终输出是:

   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 Amount required )
  • 因此,将第一个贷方“Lender 1”的值分配或设置给拿钱的借款人并设置剩余值200 AmountLenderHave 的第一个值将是 300,因为这是该人第一次借出金额。
  • 200(firstLender) >= 200 (secondBorrower 需要的金额)

Likeise,对每个贷方行进行迭代,依此类推,直到没有贷方为止。

2 个回复

我认为使用 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

这是我的解决方案。 我也将数据框转换为列表。 此代码还处理借款人必须从多个贷方借款的情况,如下例所示:

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
1 熊猫结合数据框

我有以下两个数据帧:第一列是索引,最后一列是通过在索引后附加一个'.txt'来从索引派生的。 我想将它们结合起来: 我尝试使用pandas merge,但是不确定如何使用for循环进行迭代。 有什么建议么? ...

2 在熊猫中组合两个数据框

我有 2 个数据框: df: df1: 我想将列部门和市场从 df1 添加到 df。 df1 具有符号的唯一值,因此数据帧比原始数据帧 df 小。 我试着做: 但是输出扩展的行超出了预期。 任何人都可以帮助了解这里遗漏了什么。 谢谢 ...

3 组合多个 Pandas DataFrames

我有多个具有相同格式的 DataFrame。 我想创建一个结合以前的数据框。 结果数据帧的每一行都是先前数据帧之一的一行,其中某一列是最大值, 例子 预期结果是: 我有超过 500.000 行和 51 列,我正在寻找比解析所有数据更快的东西(O(n2) 的复杂性太大了) 谢谢你。 ...

4 熊猫结合了2个数据框并覆盖值

我研究了熊猫连接,合并,具有不同参数值(如何连接,索引,axis = 1等)的concat,但没有任何方法可以解决! 我有两个数据框: 我想合并到一个数据帧,其中第2列和第3列中y的值覆盖x的值,然后在最后插入第4列和第5列: ...

5 结合字典的两个熊猫数据框

我想采用2个单独的数据帧,每个数据帧由一堆字典组成,并将它们组合以产生以下内容: 其中pd.some_function接受两个pd.some_function并执行字典的单元式合并: 我知道我可以使用for循环来做到这一点,但是有一个熊猫函数可以更简洁地做到这一点吗? 仅仅添加 ...

7 结合/拼接熊猫数据帧与条件

我有两个熊猫数据框, A和B 。 数据框具有相同的索引和列,只是数据不同。 我有一个额外的数组X ,它是索引的子集。 我想要实现的是:生成的矩阵C也具有与A和B相同的索引和列。 对于它的数据,如果索引在X 中,它从数据帧A中获取行条目,否则它从B 中获取行条目。 我认为会有一种 pythonic ...

9 熊猫结合不同索引的数据框

我有两个具有不同索引和列的数据df_1和df_2 。 但是,有些索引和列重叠。 我用索引和列的并集创建了一个数据框df :因此,这里没有重复的索引或列。 我想通过以下方式填充数据框df : 谁能告诉我这样做的有效方法? 谢谢! ...

10 熊猫:组合数据框的有效方法

我正在寻找一种比pd.concat更有效的方法来组合两个熊猫DataFrame。 我有一个大型DataFrame(大小约为7GB),其中包含以下各列-“ A”,“ B”,“ C”,“ D”。 我想按“ A”对帧进行分组,然后对每个组:“ B”进行分组,对“ C”求平均值,对“ D”求和, ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM