You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中使用Pandas实现Temporal Join(时态连接)

解决Pandas中的时态连接(Temporal Join)问题

针对你需要将df的TIME值匹配到labelDf的时间区间并更新LABEL的需求,这里有两种可行的方法,其中矢量化方法更适合大数据集,效率更高。

方法一:使用区间索引(高效矢量化操作)

这种方法利用Pandas的IntervalIndex来快速匹配时间区间,避免了逐行遍历的低效操作,处理大规模数据时优势明显。

首先构造示例数据(你可以直接替换成自己的数据集):

import pandas as pd

# 构造你的df数据集
df = pd.DataFrame({
    'TIME': [1,2,3,5,6,7,10,11,13,15],
    'some_features': ['f']*10,
    'LABEL': [-1]*10
})

# 构造你的labelDf数据集
labelDf = pd.DataFrame({
    'TIME_START': [2,6,9,11],
    'TIME_STOP': [4,8,10,14],
    'LABEL': [0,1,2,1]
})

然后执行时态匹配:

# 从labelDf的TIME_START和TIME_STOP创建闭区间索引(包含区间端点,比如TIME=2、10这类边界值也能匹配)
intervals = pd.IntervalIndex.from_arrays(labelDf['TIME_START'], labelDf['TIME_STOP'], closed='both')

# 找到df中每个TIME对应的区间在labelDf中的索引(无匹配时返回-1)
match_indices = intervals.get_indexer(df['TIME'])

# 更新df的LABEL:有匹配的用labelDf对应值,无匹配的保留原-1
df['LABEL'] = df['LABEL'].where(match_indices == -1, labelDf.loc[match_indices, 'LABEL'].values)

运行后你就能得到想要的结果:

TIME some_features  LABEL
0     1             f     -1
1     2             f      0
2     3             f      0
3     5             f     -1
4     6             f      1
5     7             f      1
6    10             f      2
7    11             f      1
8    13             f      1
9    15             f     -1

方法二:使用apply(适合小数据集)

如果你的数据集规模很小,也可以用apply逐行处理,代码更直观但效率较低:

def get_matching_label(time):
    # 筛选出包含当前time的区间行
    match_row = labelDf[(labelDf['TIME_START'] <= time) & (time <= labelDf['TIME_STOP'])]
    # 返回匹配的LABEL值,无匹配则返回原默认值-1
    return match_row['LABEL'].iloc[0] if not match_row.empty else -1

# 将函数应用到df的TIME列,更新LABEL
df['LABEL'] = df['TIME'].apply(get_matching_label)

两种方法对比

  • 区间索引法:完全矢量化操作,处理大数据集时速度远超apply,是生产环境的优先选择。
  • apply法:代码逻辑简单易懂,但逐行处理会随着数据量增大显著变慢,适合小样本测试或快速验证逻辑。

内容的提问来源于stack exchange,提问作者Guido Muscioni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:41:36