合并最近日期的数据框

时间:2017-03-31 20:56:20

标签: python pandas

我有一些主题ID和日期索引的实验数据。我想将数据加在一起,但受试者可能会在不同的日子进行实验。这是我的意思的一个例子。下面显示的是两个不同实验的结果

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

我想将行加入到最近的可用日期。理想情况下,我想要的输出是

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

注意"最近的日期"绝对值最接近。我怎样才能实现这样的目标呢?

1 个答案:

答案 0 :(得分:2)

我不知道是否有办法用默认的pandas功能做你想做的事情,但使用自定义聚合功能可以直接做到这一点:

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

在此代码段中,这两个框架最初在SubjectID上合并,生成Date1Date2的所有可能组合。然后,pick_closest函数为每个Date1 / Date2组选择SubjectIDDate1之间日期差异最小的行。