J'ai le dataframe suivant : Col1 est le paiement.

Col1     Value
Item1    100
Item2    200
Item3    300

Et Col2 est le coût du projet

Col2        Value
Project1    200
Project2    300
Project3    400

Je veux essentiellement faire correspondre Col1 avec le projet dans Col2.

Comment puis-je obtenir la trame de données suivante ?

Col2         Value    Col1 
Project1     100      Item1
Project1     100      Item2
Project2     100      Item2
Project2     200      Item3
Project3     100      Item3
Project3     300    

Y a-t-il quelque chose que je puisse faire dans les pandas pour obtenir ce résultat ? Merci beaucoup

0
Kilometers 19 févr. 2020 à 10:22

1 réponse

Meilleure réponse

Ici, vous pouvez trouver la logique, des commentaires sont ajoutés pour l'explication :

# 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])      

Exemple de sortie entrez la description de l'image ici

Selon vos nouvelles données, nous devons simplement changer le nom de la colonne en code ci-dessus :

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']))

Sortir: entrez la description de l'image ici

1
Mohit Sharma 20 févr. 2020 à 05:19