0
votes

Pandas Dataframe remplacer les contenus en fonction de l'identifiant d'un autre Dataframe

C'est ce que mon point de données principal ressemble à:

Group    IDs               New ID 
1        [Mark,Silo,Bond]  Niki
2        [Troy,Fangio]     Kvyat


1 commentaires

Une réponse a-t-elle résolu votre problème? Si oui, veuillez considérer accepté :-)


3 Réponses :


0
votes

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


0 commentaires

0
votes

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 xxx pré>

impression (df1) p> xxx pré>

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]


1 commentaires

Était-ce utile @shahnawaz? Ou vous avez besoin de quelque chose d'autre fait?



0
votes

IIUC Vous pouvez .explode code> vos listes, remplacer les valeurs avec .map code> et les regrouper avec .groupby code> xxx pré >

Si NOUVELLE ID STROND> Colonne n'est pas une liste, vous pouvez utiliser uniquement .map () code> p>

df['New ID'] = df['New ID'].map(df1.set_index('ID')['Name'])


1 commentaires

AVIS: pandas.explode () est une fonction de la version 0.25.