【问题标题】:Merge dataframe on closest date在最近的日期合并数据框
【发布时间】:2017-08-26 05:57:21
【问题描述】:

我有一些按主题 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

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

【问题讨论】:

  • 如果有两个相同接近的 ScoreB 日期与一个 ScoreA 日期,期望的结果是什么?例如ScoreA 日期为 9/24,ScoreB 日期为 9/22 和 9/26?还是保证永远不会发生。
  • @B.Shieh 不能保证。在这种情况下,我希望更早的日期。
  • 在您的示例中,如果 2016-09-20 更接近 2016-09-21,为什么 Date1=2016-09-21 与 Date2=2016-09-24 相关联?
  • @foglerit 哦,很好,这只是我的疏忽。
  • 我没用过,不过你可以看看pandas.merge_asof。也许尝试合并日期和 groupby SubjectID? pandas.pydata.org/pandas-docs/version/0.19.0/generated/…

标签: python pandas


【解决方案1】:

我不知道是否有办法使用默认的 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

在这段代码 sn-p 中,两个帧最初在SubjectID 上合并,生成Date1Date2 的所有可能组合。然后pick_closest 函数为每个SubjectID/Date1 组选择Date1Date2 之间日期差异最小的行。

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2018-03-21
    • 1970-01-01
    • 2018-08-15
    • 2016-01-30
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多