Python 如何进行数据帧减法?
我有以下数据帧: Col1是付款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 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']))