我有一些实验数据,这些数据由受试者 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
和 Date2
的所有可能组合。然后 pick_closest
函数为每个 SubjectID
/ 选择
组。 Date1
和 Date2
之间日期差异最小的行>Date1
关于python - 在最近的日期合并数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43149536/