我有一些数据,一些实验的索引,主题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注“最近日期”是最接近绝对值的日期。我怎样才能实现这样的目标?
发布于 2017-04-01 01:11:21
我不知道是否有一种使用默认熊猫功能来实现您想要的功能的方法,但是使用自定义聚合函数来实现它是很简单的:
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函数为每个SubjectID/Date1组选择Date1和Date2之间日期差异最小的行。
https://stackoverflow.com/questions/43149536
复制相似问题