Python 如何进行数据帧减法?

Python 如何进行数据帧减法?,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: Col1是付款 Col1 Value Item1 100 Item2 200 Item3 300 Col2是项目成本 Col2 Value Project1 200 Project2 300 Project3 400 我基本上希望将Col1与Col2中的项目相匹配 如何获取以下数据帧 Col2 Value Col1 Project1 100 Item1 Project1

我有以下数据帧: Col1是付款

Col1     Value
Item1    100
Item2    200
Item3    300
Col2是项目成本

Col2        Value
Project1    200
Project2    300
Project3    400
我基本上希望将Col1与Col2中的项目相匹配

如何获取以下数据帧

Col2         Value    Col1 
Project1     100      Item1
Project1     100      Item2
Project2     100      Item2
Project2     200      Item3
Project3     100      Item3
Project3     300    
我能在熊猫身上做些什么来获得这个结果吗?
非常感谢

在这里,您可以找到逻辑,并添加注释进行解释:

# making list of project requirement and item value to iterate
item_cost = list(zip(payment['Col1'], payment['value']))
requirment = list(zip(project_cost['Col2'], project_cost['value']))

d = {}
for project, cost in requirment:
    item_used = []
    try:
        while cost > 0: 
            if item_cost[0][1] <= cost: # if item is having less cost than requirement
                cost -= item_cost[0][1] # making requirement less by item cost
                item_used.append((item_cost[0][1], item_cost[0][0]))
                item_cost = item_cost[1:] # removing item from item_cost once used
            else: 
                item_cost[0] = ((item_cost[0][0], item_cost[0][1] - cost))
                item_used.append((cost, item_cost[0][0]))
                cost = 0
    except: # when item list will be finished exception will be called
        item_used.append((cost,np.nan))
    d[project] = item_used
# d is dict having project as key and item used
project_cost['Col1'] = project_cost['Col2'].map(d)          
pr_cost = project_cost.explode("Col1")            
pr_cost['value'] = pr_cost['Col1'].apply(lambda x:x[0])            
pr_cost['Col1'] = pr_cost['Col1'].apply(lambda x:x[1])      
#列出项目需求和项目价值以进行迭代
项目成本=列表(邮政编码(付款['Col1',付款['value']))
需求=列表(zip(项目成本['Col2'],项目成本['value']))
d={}
对于项目,所需成本:
项目_使用=[]
尝试:
成本>0时:
如果项目成本[0][1]0:

如果项目成本[0][1],为什么只重复
Item2
?您能解释最终输出的确切逻辑吗?@jezreal我希望Col1与Col2匹配。首先在Col2中,项目1的值是200。Col1中的Item1无法满足需求(即100),因此item2分为两部分来支付项目1。为什么最后一个
Item3
缺失?@Mohitharma您是否更清楚地理解最终输出逻辑?非常感谢,谢谢。但是,当我尝试在Col2中输入其他名称时,出现了错误:-->20 pr_cost['Value']=pr_cost['Col1'].apply(lambda x:x[0])TypeError:'float'对象不可订阅您知道如何解决它吗?payment=pd.DataFrame({'payment':[“BankA”,“BankB”,“BankC”,“BankD”,“BankE”,“BankE”,“BankA”,“BankC”],'Value:[100010001000100060040010005000700]))project_cost=pd.DataFrame({'project':[“ProjectA”,“projectzzz”,“Food(20%)”,“AAA”,“bbbbbb”,“CCCCC”,“88”,“QWER”],'cost':[8573190381023341465,44153516])我添加了这两个数据框架。请看一看。而且,它们的列也不相同。一个是“价值”,另一个是“成本”。非常感谢。非常感谢你的好心助手。这正是我想要的。我对lambda函数有些困惑。apply(lambda x:x[0])实际做什么?我猜它是从x[0]和x[1]列中得到值和bank的,在这种情况下,x指的是哪个数据帧?
item_cost = list(zip(payment['Payment'], payment['Value']))
requirment = list(zip(project_cost['Project'], project_cost['Cost']))
d = {}
for project, cost in requirment:
    item_used = []
    try:
        while cost > 0: 
            if item_cost[0][1] <= cost: # if item is having less cost than requirement
                cost -= item_cost[0][1] # making requirement less by item cost
                item_used.append((item_cost[0][1], item_cost[0][0]))
                item_cost = item_cost[1:] # removing item from item_cost once used
            else: 
                item_cost[0] = ((item_cost[0][0], item_cost[0][1] - cost))
                item_used.append((cost, item_cost[0][0]))
                cost = 0
    except: # when item list will be finished exception will be called
        item_used.append((cost,np.nan))
    d[project] = item_used
project_cost['bank_val'] = project_cost['Project'].map(d)          
pr_cost = project_cost.explode("bank_val")            
pr_cost['value'] = pr_cost['bank_val'].apply(lambda x:x[0])            
pr_cost['bank'] = pr_cost['bank_val'].apply(lambda x:x[1]) 
print(pr_cost.drop(columns = ['bank_val', 'Cost']))