C'est ce que mon point de données principal ressemble à:
Group IDs New ID 1 [Mark,Silo,Bond] Niki 2 [Troy,Fangio] Kvyat
3 Réponses :
Vous pouvez essayer de faire une dicte à partir de votre deuxième DF, puis de remplacer le premier à l'aide des motifs de regex (pas besoin de le comprendre parfaitement, vérifiez les commentaires ci-dessous):
PS: puisque vous n'avez pas fourni le df complet Avec les codes, j'ai créé avec certains d'entre eux, c'est pourquoi l'impression () ne remplacera pas tous les résultats. P>
import pandas as pd
# creating dummy dfs
df1 = pd.DataFrame({"Group":[1,2], "IDs":["[N23,N1,N12]", "[N134,N100]"], "New ID":["N102", "N501"] })
df2 = pd.DataFrame({"ID":['N1', "N23", "N11", "N100"], "Name":["Milo", "Mark", "Jacob", "Silo"], "Age":[5,21,22, 44]})
# Create the unique dict we're using regex patterns to make exact match
dict_replace = df2.set_index("ID")['Name'].to_dict()
# 'f' before string means fstrings and 'r' means to interpret it as regex
# the \b is a regex pattern that it sinalizes the begining and end of the match
## so that if you're searching for N1, it won't match if it is N11
dict_replace = {fr"\b{k}\b":v for k, v in dict_replace.items()}
# Replacing on original where you want it
df1['IDs'].replace(dict_replace, regex=True, inplace=True)
print(df1['IDs'].tolist())
# >>> ['[Mark,Milo,N12]', '[N134,Silo]']
Veuillez noter le changement de maframes. Dans votre exemple de données, les identifiants dans DF qui n'existent pas dans les identifiants DF1. J'ai modifié mon DF pour que seuls les identifiants dans DF1 étaient représentés. J'utilise le df suivant impression (df1) p> solution strong> p> dict df1.id et df.name et carte à un DF.Id explosé. Ajoutez le résultat à la liste. P> df['IDs'] = df['IDs'].str.strip('[]')#Strip corner brackets
df['IDs'] = df['IDs'].str.split(',')#Reconstruct list, this was done because for some reason I couldnt explode list
#df.explode list and map df1 to df and add to list
df.explode('IDs').groupby('Group')['IDs'].apply(lambda x:(x.map(dict(zip(df1.ID,df1.Name)))).tolist()).reset_index()
Group IDs
0 1 [Mark, Milo, Jacob]
1 2 [Jacob, Mark]
Était-ce utile @shahnawaz? Ou vous avez besoin de quelque chose d'autre fait?
IIUC Vous pouvez Si .explode code> vos listes, remplacer les valeurs avec .map code> et les regrouper avec .groupby code> .map () code> p> df['New ID'] = df['New ID'].map(df1.set_index('ID')['Name'])
AVIS: pandas.explode () code> est une fonction de la version 0.25.
Une réponse a-t-elle résolu votre problème? Si oui, veuillez considérer accepté :-)