为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas - 将来自两个数据帧的最近事件与条件连接起来

Pandas - 将来自两个数据帧的最近事件与条件连接起来

眼眸繁星 2023-04-25 16:43:50
我需要一些帮助。我陷入了一个问题。我有以下DFDF1DATETIME           ID       State2020-07-29 00:15:10   A     Down2020-07-29 00:25:10   B     Down2020-07-29 01:14:30   A     Down2020-07-29 02:15:50   A     DownDF2DATETIME            ID      State2020-07-29 00:19:40   A     Up2020-07-29 00:35:10   B     Up2020-07-29 00:56:40   B     Up2020-07-29 01:40:30   A     Up2020-07-29 01:35:10   B     Up2020-07-29 02:18:50   A     Up2020-07-29 02:45:50   A     Up我想要以下结果:新东风DATETIME             ID     State   Restore_DT2020-07-29 00:15:10    A    Down    2020-07-29 00:19:402020-07-29 00:25:10    B    Down    2020-07-29 00:35:102020-07-29 01:14:30    A    Down    2020-07-29 01:40:302020-07-29 02:15:50    A    Down    2020-07-29 02:18:50理论上,我需要从 DF1 中找到 DF2 中具有相同 ID 的最近事件。最好的方法是什么?
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

merge_asof与参数一起使用direction='nearest',也首先对列进行排序并通过以下方式创建新列DataFrame.assign

df1['DATETIME'] = pd.to_datetime(df1['DATETIME'])

df2['DATETIME'] = pd.to_datetime(df2['DATETIME'])


df1 = df1.sort_values('DATETIME')

df2 = df2.sort_values('DATETIME')


df = pd.merge_asof(df1, 

                   df2[['DATETIME','ID']].assign(Restore_DT = df2['DATETIME']), 

                   on='DATETIME', 

                   by='ID', 

                   direction='nearest')

print (df)

             DATETIME ID State          Restore_DT

0 2020-07-29 00:15:10  A  Down 2020-07-29 00:19:40

1 2020-07-29 00:25:10  B  Down 2020-07-29 00:35:10

2 2020-07-29 01:14:30  A  Down 2020-07-29 01:40:30

3 2020-07-29 02:15:50  A  Down 2020-07-29 02:18:50


查看完整回答
反对 回复 2023-04-25
?
茅侃侃

TA贡献1842条经验 获得超21个赞

您可以使用merge.

首先合并 df(这会将 datetime 与最近的 datetime1 合并)

df_cross_merge = df1.merge(df2, on='ID', how='left').query('DATETIME <= DATETIME1')

并获得您想要的 df(仅保留第一个日期时间)

df_cross_merge =df_cross_merge.drop_duplicates(['DATETIME'],keep='first')


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信