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'}
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.
4 Réponses :
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)
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
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
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
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.21est-elle censée devenirBondUSB21dans la sortie? Ou voulez-vous que la sortie soitUSB21,Bond.US.B.21, ou autre chose? https: