python - 在最近的日期合并数据框

标签 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

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

最佳答案

我不知道是否有办法用默认的 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 函数为每个 SubjectID/ 选择 Date1Date2 之间日期差异最小的行>Date1 组。

关于python - 在最近的日期合并数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43149536/

相关文章:

python-3.x - 如何对齐 pandas 中的输出

python - 具有 Python PuLP 性能问题的 MILP 模型 - 求解器非常慢

python - 使用 Python/Suds 调用名称中带有点的 SOAP 方法

python - Pandas 填补了性能问题

python - 如何在 matplotlib 中将 x 轴作为日期时间的条形图和线图结合起来

python - 基于多个键之一对 Pandas 中的一系列值求和?

python - 根据输入其他列的组合定义 pandas 列

python - 如何在不展平 MultiIndex 的情况下向 pandas DataFrame 添加一行

python - 在 pyside 中取消 QWidget 的布局

python - 在不知道嵌套级别数的情况下递归迭代到所有嵌套数组的最佳方法?