我有一些实验的一些数据,按主题 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
请注意,“最近日期”的绝对值最接近。我怎样才能实现这样的目标?
我不知道是否有办法使用默认的 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
and Date2
。然后pick_closest
函数选择之间日期差异最小的行Date1
and Date2
对于每个SubjectID
/Date1
group.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)