2 votes

Ajout de valeur uniquement à une première combinaison pendant la fusion

J'ai deux dfs :

df_1

date            id          value
2021-01-01      A1          100
2021-01-01      A1          200
2021-01-01      A1          300
2021-01-02      A1          100
2021-01-02      A1          200
2021-01-03      A1          500
2021-01-03      A1          800

df_2

date            id          value_to_add
2021-01-01      A1          150 
2021-01-03      A1          350 

J'essaie de maintenir la structure de df_1 et d'ajouter le value_to_add dans la première occurrence lors de la fusion, de sorte que le résultat final ressemble à ceci après le remplissage NaN et toutes les valeurs, sauf les premières, avec un 0 :

date            id          value       value_to_add
2021-01-01      A1          100         150 
2021-01-01      A1          200         0               # 0 because the 150 have been already added
2021-01-01      A1          300         0
2021-01-02      A1          100         0               # 0 because value_to_add does not exist
2021-01-02      A1          200         0
2021-01-03      A1          500         350 
2021-01-03      A1          800         0               # 0 because the 350 have been already added

Ma première idée était de supprimer les doublons d'une ['date', 'id'] puis fusionner df_2 mais je ne suis pas sûr de la façon dont je pourrais revenir à la structure originale de df_1 .

Le problème est donc le suivant - être capable de fusionner sur la première occurrence des clés pendant pd.merge opération . Je n'ai rien trouvé sur ce sujet et, franchement, je ne sais pas comment y parvenir.

3voto

jezrael Points 290608

Vous pouvez filtrer les valeurs dupliquées par DataFrame.duplicated avec masque inversé et Index.union pour éviter de supprimer les nouvelles colonnes ajoutées à partir de merge :

df_1.loc[~df_1.duplicated(['date', 'id']),
         df_1.columns.union(df_2.columns)] = df_1.merge(df_2, how='left')
df_1 = df_1.fillna(0)
print (df_1)
         date  id  value  value_to_add
0  2021-01-01  A1    100         150.0
1  2021-01-01  A1    200           0.0
2  2021-01-01  A1    300           0.0
3  2021-01-02  A1    100           0.0
4  2021-01-02  A1    200           0.0
5  2021-01-03  A1    500         350.0
6  2021-01-03  A1    800           0.0

Une autre idée avec la colonne des compteurs d'aides :

df_1 = df_1.assign(g = df_1.groupby(['date', 'id']).cumcount()).merge(df_2.assign(g=0), how='left')
df_1 = df_1.drop('g', 1).fillna(0)
print (df_1)
         date  id  value  value_to_add
0  2021-01-01  A1    100         150.0
1  2021-01-01  A1    200           0.0
2  2021-01-01  A1    300           0.0
3  2021-01-02  A1    100           0.0
4  2021-01-02  A1    200           0.0
5  2021-01-03  A1    500         350.0
6  2021-01-03  A1    800           0.0

2voto

wwnde Points 14457
s =df_1.set_index(['date','id']).join(df_2.set_index(['date','id']))

s=s.assign(value_to_add=np.where(~s['value_to_add'].duplicated(keep='first'),s['value_to_add'],np.nan)).fillna(0)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X