1
votes

Comment créer une nouvelle chaîne en combinant des valeurs correspondant à des clés dans plusieurs dictionnaires en Python?

J'ai deux dictionnaires:

bond_names=pd.DataFrame({'Names':['Bond.USD.JAN.21','Bond.USD.MAR.25','Bond.EUR.APR.22','Bond.HUF.JUN.21','Bond.HUF.JUL.23','Bond.GBP.JAN.21']})

et un tableau composé d'une seule colonne contenant les noms des obligations:

time = {'JAN':'A','FEB':'B','MAR':'C','APR':'D','MAY':'E','JUN':'F','JUL':'H'}

currency={'USD':'US','EUR':'EU','GBP':'GB','HUF':'HF'}

 entrez la description de l'image ici

Je dois remplacer le nom par une chaîne du format suivant: EUA21 où les deux premières lettres correspondent à la valeur correspondant à la clé de devise dans le dictionnaire, le la lettre suivante est la valeur correspondant à la clé du mois et les deux derniers chiffres correspondent à l'année du nom.

J'ai essayé de diviser le nom en utilisant le code suivant:

bond_names ['Names'] = bond_names ['Names']. apply (lambda x: x.split ('.'))

mais je ne sais pas comment procéder à partir d'ici pour créer la chaîne car je dois rechercher dans les dictionnaires en même temps la devise et le mois extraire les valeurs rejoignez-les et ajoutez l'année du nom dessus.


3 commentaires

s'il vous plaît voir ci-dessus ajouté comme code merci


Publiez également votre résultat attendu (pas sous forme d'image)


L'entrée Bond.USD.FEB.21 est-elle censée devenir BondUSB21 dans la sortie? Ou voulez-vous que la sortie soit USB21 , Bond.US.B.21 , ou autre chose? https:


4 Réponses :


1
votes

Cela vous donnera une liste de ce dont vous avez besoin:

time = {'JAN':'A','FEB':'B','MAR':'C','APR':'D','MAY':'E','JUN':'F','JUL':'H'}

currency={'USD':'US','EUR':'EU','GBP':'GB','HUF':'HF'}

bond_names = {'Names':['Bond.USD.JAN.21','Bond.USD.MAR.25','Bond.EUR.APR.22','Bond.HUF.JUN.21','Bond.HUF.JUL.23','Bond.GBP.JAN.21']}

result = []

for names in bond_names['Names']:
    bond = names.split('.')
    result.append(currency[bond[1]] + time[bond[2]] + bond[3])

print(result)


0 commentaires

0
votes

Vous pouvez le faire comme ceci:

import pandas as pd

time = {'JAN':'A','FEB':'B','MAR':'C','APR':'D','MAY':'E','JUN':'F','JUL':'H'}
currency = {'USD':'US','EUR':'EU','GBP':'GB','HUF':'HF'}
bond_names = pd.DataFrame({'Names': ['Bond.USD.JAN.21', 'Bond.USD.MAR.25', 'Bond.EUR.APR.22', 'Bond.HUF.JUN.21', 'Bond.HUF.JUL.23', 'Bond.GBP.JAN.21']})
bond_names['Names2'] = bond_names['Names'].apply(lambda x: currency[x[5:8]] + time[x[9:12]] + x[-2:])
print(bond_names['Names2'])
# 0    USA21
# 1    USC25
# 2    EUD22
# 3    HFF21
# 4    HFH23
# 5    GBA21
# Name: Names2, dtype: object


0 commentaires

0
votes

Avec substitution de regex étendue:

In [42]: bond_names['Names'].str.replace(r'^[^.]+\.([^.]+)\.([^.]+)\.(\d+)', lambda m: '{}{}{}'.format(curre
    ...: ncy.get(m.group(1), m.group(1)), time.get(m.group(2), m.group(2)), m.group(3)))                    
Out[42]: 
0    USA21
1    USC25
2    EUD22
3    HFF21
4    HFH23
5    GBA21
Name: Names, dtype: object


0 commentaires

0
votes

Vous pouvez essayer ceci:

   Names 
0  USA21 
1  USC25  
2  EUD22 
3  HFF21  
4  HFH23  
5  GBA21

Sortie

import pandas as pd

time = {'JAN':'A','FEB':'B','MAR':'C','APR':'D','MAY':'E','JUN':'F','JUL':'H'}
currency={'USD':'US','EUR':'EU','GBP':'GB','HUF':'HF'}

bond_names=pd.DataFrame({'Names':['Bond.USD.JAN.21','Bond.USD.MAR.25','Bond.EUR.APR.22','Bond.HUF.JUN.21','Bond.HUF.JUL.23','Bond.GBP.JAN.21']})

bond_names['Names']=bond_names['Names'].apply(lambda x: x.split('.'))

for idx, bond in enumerate(bond_names['Names']):
    currencyID = currency.get(bond[1])
    monthID = time.get(bond[2])
    yearID = bond[3]
    bond_names['Names'][idx] = currencyID + monthID + yearID


0 commentaires