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

如何用向量化方法在Pandas DataFrame中匹配获取历史值

Pandas向量化实现日期对应值的匹配

核心思路

利用日期唯一的特性,先构建日期到Value的映射关系,再通过向量化的条件判断选择对应的值,完全替代循环实现高效计算。

步骤实现

  1. 转换日期列类型:确保所有日期列是datetime类型,否则字符串比较会出现逻辑错误
import pandas as pd
import numpy as np

# 构造示例DataFrame
data = {
    'Category': ['A', 'B', 'B', 'A', 'A'],
    'Date': ['2022-07-15', '2022-07-16', '2022-07-17', '2022-07-18', '2022-07-19'],
    'Value': [4, 2, 6, 7, 9],
    'PrevDate1': ['2022-07-01', '2022-07-08', '2022-07-05', '2022-07-10', '2022-07-18'],
    'PrevDate2': ['2022-07-02', '2022-07-09', '2022-07-16', '2022-07-15', '2022-07-15']
}
df = pd.DataFrame(data)

# 转换所有日期列为datetime类型
date_cols = ['Date', 'PrevDate1', 'PrevDate2']
df[date_cols] = df[date_cols].apply(pd.to_datetime)
  1. 构建日期-Value映射:利用Date作为索引创建Series,实现O(1)级别的快速查找
date_value_map = df.set_index('Date')['Value']
  1. 向量化计算PrevVal:用map获取每个PrevDate对应的Value,再通过np.where执行条件选择
# 获取两个PrevDate对应的Value
prev1_vals = df['PrevDate1'].map(date_value_map)
prev2_vals = df['PrevDate2'].map(date_value_map)

# 按规则选择值:PrevDate1更新则取prev1_vals,否则取prev2_vals
df['PrevVal'] = np.where(df['PrevDate1'] > df['PrevDate2'], prev1_vals, prev2_vals)

结果说明

运行后得到的DataFrame如下,其中没有匹配到对应日期的行会显示为NaN(对应需求中的X、Y),如果需要替换为特定标记,可以用df['PrevVal'] = df['PrevVal'].fillna('X')这类方法处理:

CategoryDateValuePrevDate1PrevDate2PrevVal
A2022-07-1542022-07-012022-07-02NaN
B2022-07-1622022-07-082022-07-09NaN
B2022-07-1762022-07-052022-07-162.0
A2022-07-1872022-07-102022-07-154.0
A2022-07-1992022-07-182022-07-157.0

原代码无法运行的原因

原代码中df['Value'][df['Date'] == df['PrevDate1']]的写法逻辑错误:这里是将整个Date列和每行的PrevDate1做广播比较,返回的是长度等于DataFrame总行数的布尔数组,无法对应到每行的匹配值。而用map或索引查找的方式,是真正逐行匹配对应的日期值,属于正确的向量化操作。

对应SQL逻辑的Pandas等价实现

你提到的SQL关联子查询,在Pandas中通过构建映射关系+向量化匹配实现:

  • SQL中的select Value from table where Date = tb.PrevDate1对应Pandas中的df['PrevDate1'].map(date_value_map)
  • 条件判断case when...对应np.where()

内容的提问来源于stack exchange,提问作者echo unlucky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:35:21