如何在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)
方案说明
- 遍历过程中,先根据当前行的
Next_value查询字典,直接获取之前最新的number值 - 再用当前行的
Value和number更新字典,确保后续行查询时拿到的是最新记录 - 全程仅一次线性遍历,无冗余计算,处理大数据量时性能远优于join类方法
内容的提问来源于stack exchange,提问作者python_interest
相关产品推荐
相关产品推荐

