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

Pandas滚动条件匹配:查找历史最小值并生成匹配结果

Pandas按ID分组匹配历史更小值实现

给定包含ID(取值为A、B)、Date、MT、Values列的Pandas DataFrame,需按ID分组,对每行的MT和Values,查找同分组内当前行之前所有满足MT更小且Values更小的记录,将匹配到的Values和Date分别存入Matched Values和Matched Dates列。

步骤1:构造示例数据

先创建符合结构的测试DataFrame:

import pandas as pd

data = {
    'ID': ['A', 'A', 'A', 'B', 'B', 'B'],
    'Date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03'],
    'MT': [5, 3, 4, 6, 2, 5],
    'Values': [10, 8, 9, 15, 12, 14]
}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])

步骤2:实现匹配逻辑

通过groupby分组后,自定义函数遍历每行筛选符合条件的历史记录:

def find_matching_records(group):
    matched_vals = []
    matched_dts = []
    
    for idx, current_row in group.iterrows():
        # 筛选当前行之前、MT更小、Values更小的记录
        filter_mask = (group.index < idx) & (group['MT'] < current_row['MT']) & (group['Values'] < current_row['Values'])
        matches = group[filter_mask]
        
        # 把匹配结果转为列表,无匹配则留空列表
        matched_vals.append(matches['Values'].tolist())
        matched_dts.append(matches['Date'].dt.strftime('%Y-%m-%d').tolist())
    
    group['Matched Values'] = matched_vals
    group['Matched Dates'] = matched_dts
    return group

# 按ID分组处理,group_keys=False避免分组键冗余
final_df = df.groupby('ID', group_keys=False).apply(find_matching_records)

结果展示

执行后final_df的输出如下:

ID       Date  MT  Values Matched Values Matched Dates
0  A 2023-01-01   5      10              []            []
1  A 2023-01-02   3       8              []            []
2  A 2023-01-03   4       9           [8]      [2023-01-02]
3  B 2023-01-01   6      15              []            []
4  B 2023-01-02   2      12              []            []
5  B 2023-01-03   5      14          [12]      [2023-01-02]

优化说明

如果处理的数据集较大,iterrows的效率可能不足,可改用向量化方式实现(比如利用广播或滚动窗口),但上述代码逻辑清晰,适合中小规模数据场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:55:04