我有一些主题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
注意"最近的日期"绝对值最接近。我怎样才能实现这样的目标呢?
答案 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
上合并,生成Date1
和Date2
的所有可能组合。然后,pick_closest
函数为每个Date1
/ Date2
组选择SubjectID
和Date1
之间日期差异最小的行。