3
votes

Equivalent de la requête SQL dans le dataframe Pandas

J'ai deux tables 1.Table_A 2.Table_B Je voudrais mettre à jour table_A particulière colonne en utilisant table_B de nouvelles valeurs pour cette colonne, il peut arriver que le nombre de lignes de Table_A ne corresponde pas à Table_B. Je sais comment écrire une requête pour mettre à jour Table_A en utilisant SQL mais je ne sais pas comment faire dans les pandas, j'ai besoin d'un équivalent de la requête de mise à jour dans les pandas

Requête de mise à jour:

Table_A
id_emp    |   dt_of_join     
  2       |   30-03-2018
  4       |   01-01-2019
  5       |   21-06-2019
  7       |   10-06-2018
  12      |   03-02-2019
  10      |   09-05-2019
  19      |   25-12-2018

J'ai besoin de l'équivalent de la requête ci-dessus dans Pandas Dataframe, toute aide vraiment appréciée.

Exemple:

Table_B
 id_emp   |   dt_of_join
   4      |    01-01-2019
   12     |    03-02-2019
   10     |    09-05-2019
   5      |    21-06-2019

Le tableau B est la sous-requête qui se trouve à l'intérieur du requête ci-dessus

Table_A
id_emp    |   dt_of_join     
  2       |   30-03-2018
  4       |   03-04-2018
  5       |   04-05-2018
  7       |   10-06-2018
  12      |   20-07-2018
  10      |   09-08-2018
  19      |   25-12-2018

Une fois la requête de mise à jour réussie, la table_A devrait ressembler à ceci

update table_A
    set dt_of_join = sq.dt_of_join
    from (select id_emp, max(joining) as dt_of_join
            from table_B 
            group by id_emp ) as sq
    where table_A.id_emp = sq.id_emp


0 commentaires

3 Réponses :


1
votes

Pourquoi pas reindex:

>>> df['dt_of_join'] = df2.set_index('id_emp').reindex(df['id_emp']).reset_index()['dt_of_join'].fillna(df['dt_of_join'])
>>> df
   id_emp  dt_of_join
0       2  30-03-2018
1       4  01-01-2019
2       5  21-06-2019
3       7  10-06-2018
4      12  03-02-2019
5      10  09-05-2019
6      19  25-12-2018
>>> 


3 commentaires

oui, je veux dire la même chose mais que NaN ne devrait pas être NaN, il devrait être ce qu'il était avant pour la base de données ci-dessus, vous avez mentionné que cela devrait être c


@RAHULVISHWAKARMA J'ai modifié ma réponse, veuillez l'accepter


Hé, j'apprécie vraiment vos efforts, mais cela n'a toujours pas répondu correctement à ma question.Pouvez-vous s'il vous plaît jeter un œil à la question que je viens de modifier afin que vous ayez une idée de ce que je pense.



1
votes

Vous pouvez utiliser series.map () avec fillna () qui est une alternative plus rapide pour une seule mise à jour de col (en supposant id_emp code> est une colonne, sinon d doit être df2 ['dt_of_join'] ):

   id_emp      dt_of_join
0       2      30-03-2018
1       4      01-01-2019
2       5      21-06-2019
3       7      10-06-2018
4      12      03-02-2019
5      10      09-05-2019
6      19      25-12-2018

d=df2.set_index('id_emp')['dt_of_join']
df1.dt_of_join=df1.id_emp.map(d).fillna(df1.dt_of_join)
print(df1)


0 commentaires