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
相关产品推荐
相关产品推荐

