3 votes

Fusionner les dataframe sur la date la plus proche

J'ai des données pour des expériences indexées par un identifiant de sujet et une date. J'aimerais joindre les données ensemble, mais les sujets peuvent subir des expériences à des dates différentes. Voici un exemple de ce que je veux dire. Ci-dessous sont les résultats de deux expériences différentes

SubjectID  Date        ScoreA
1          2016-09-20      10
1          2016-09-21      12
1          2016-12-01      11

SubjectID  Date        ScoreB
1          2016-09-20      1
1          2016-09-24      5
1          2016-11-28      3
1          2016-12-11      9

J'aimerais joindre les lignes à la date la plus proche disponible. Idéalement, mon résultat désiré est le suivant

SubjectID   Date1         Date2        ScoreA ScoreB
1            2016-09-20    2016-09-20    10      1
1            2016-09-21    2016-09-24    12      5
1            2016-12-01    2016-11-28    11      3

Notez que la "date la plus proche" se réfère à la plus proche en valeur absolue. Comment puis-je obtenir quelque chose de similaire?

2voto

Nick Points 13

Je ne sais pas s'il existe un moyen de faire ce que vous voulez avec la fonctionnalité par défaut de pandas, mais il est simple de le faire avec une fonction d'agrégation personnalisée :

def pick_closest(g):
    closest_date_loc = (g.Date1 - g.Date2).abs().argmin()
    return g.loc[closest_date_loc, ['ScoreA','Date2','ScoreB']]

merged = df1.merge(df2, on='SubjectID', suffixes=['1', '2'])
df3  = merged.groupby(['SubjectID','Date1'], as_index=False).apply(pick_closest).reset_index()
df3

   SubjectID      Date1  ScoreA      Date2  ScoreB
0          1 2016-09-20      10 2016-09-20       1
1          1 2016-09-21      12 2016-09-20       1
2          1 2016-12-01      11 2016-11-28       3

Dans ce morceau de code, les deux dataframes sont initialement fusionnés sur SubjectID, générant toutes les combinaisons possibles de Date1 et Date2. Ensuite, la fonction pick_closest sélectionne la ligne avec la plus petite différence de date entre Date1 et Date2 pour chaque groupe SubjectID/Date1.

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