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

如何在Pandas中匹配行:基于最新记录关联Next_value与Value列

Pandas高效匹配最新前置记录实现方案

问题背景

现有如下结构的Pandas DataFrame(已按日期排序):

index   Value   Next_value   number    date
0       ABC     DEF2          3        1/1/2023
1       ABC     DEF2          4        2/1/2023
2       BDC     DEF2          1        3/1/2023
3       BDC     CCC2          2        4/1/2023
4       CCC     ABC           10       5/1/2023
5       DEF     BDC           11       6/1/2023
6       ABC     DEF3          7        7/1/2023
7       BDD     ABC           8        8/1/2023

需求说明

需要为每行新增prev_number字段:

  • 若当前行的Next_value能匹配到之前行中存在的Value,则取该Value对应的最新日期行的number值作为prev_number
  • 若没有匹配项,prev_number设为NaN

示例:

  • index=4的Next_value是ABC,匹配到之前最新的ABC记录(index=1),所以prev_number=4
  • index=5的Next_value是BDC,匹配到之前最新的BDC记录(index=3),所以prev_number=2
  • index=7的Next_value是ABC,匹配到之前最新的ABC记录(index=6),所以prev_number=7

要求:数据量极大,禁止使用交叉连接(cross join)这类低效方法。

期望输出

index   Value   Next_value   number  prev_number  date
0       ABC     DEF2          3      NaN          1/1/2023
1       ABC     DEF2          4      NaN          2/1/2023
2       BDC     DEF2          1      NaN          3/1/2023
3       BDC     CCC2          2      NaN          4/1/2023
4       CCC     ABC           10     4            5/1/2023
5       DEF     BDC           11     2            6/1/2023
6       ABC     DEF3          7      NaN          7/1/2023
7       BDD     ABC           8      7            8/1/2023

实现方案

核心思路是维护一个动态字典,实时记录每个Value对应的最新number值,遍历DataFrame时直接查询字典获取结果,时间复杂度为O(n),完全适配大数据量场景。

代码实现:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'index': [0,1,2,3,4,5,6,7],
    'Value': ['ABC','ABC','BDC','BDC','CCC','DEF','ABC','BDD'],
    'Next_value': ['DEF2','DEF2','DEF2','CCC2','ABC','BDC','DEF3','ABC'],
    'number': [3,4,1,2,10,11,7,8],
    'date': ['1/1/2023','2/1/2023','3/1/2023','4/1/2023','5/1/2023','6/1/2023','7/1/2023','8/1/2023']
})

# 初始化字典,存储每个Value对应的最新number
value_latest_number = {}
prev_numbers = []

for idx, row in df.iterrows():
    # 查询当前Next_value对应的最新number,无匹配则为NA
    prev_num = value_latest_number.get(row['Next_value'], pd.NA)
    prev_numbers.append(prev_num)
    
    # 更新字典,用当前行的Value和number覆盖旧值,保证后续查询拿到最新记录
    value_latest_number[row['Value']] = row['number']

# 将结果添加到原DataFrame
df['prev_number'] = prev_numbers

# 调整列顺序(可选,与期望输出对齐)
df = df[['index', 'Value', 'Next_value', 'number', 'prev_number', 'date']]
print(df)

方案说明

  1. 遍历过程中,先根据当前行的Next_value查询字典,直接获取之前最新的number值
  2. 再用当前行的Value和number更新字典,确保后续行查询时拿到的是最新记录
  3. 全程仅一次线性遍历,无冗余计算,处理大数据量时性能远优于join类方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:10:34