如何识别序列顺序并累加标记交易?Pandas DataFrame处理需求
解决方案
首先定义原始数据:
import pandas as pd df = pd.DataFrame({'id':[1,1,1,2,2,3,3,4,5,6,6,6,6,6,8,8,9,11,12,12], 'letter':['A','A','Q','Q','Q','F','F','G','D','G','I','I','K','Q','E','S','S','I','I','F']})
核心处理代码
通过分组处理每个id下的序列,实现交易区间的标记:
def process_group(group): # 初始化交易编号列为空值 group['tx'] = pd.NA # 获取当前分组内所有Q和I的索引 q_indices = group[group['letter'] == 'Q'].index i_indices = group[group['letter'] == 'I'].index # 若分组内无Q或无I,直接返回 if len(q_indices) == 0 or len(i_indices) == 0: return group tx_num = 1 # 循环匹配最后一个Q与后续第一个I的组合 while True: # 取未匹配的最后一个Q last_q = q_indices[-1] if len(q_indices) > 0 else None if not last_q: break # 筛选出在该Q之后的所有I valid_i = i_indices[i_indices > last_q] if len(valid_i) == 0: # 该Q之后无I,移除该Q继续匹配前面的Q q_indices = q_indices[:-1] continue # 取第一个在Q之后的I first_i = valid_i[0] # 标记从最后一个Q到第一个I的区间为当前交易编号 group.loc[last_q:first_i, 'tx'] = tx_num # 移除已匹配的Q,以及当前I之前的所有I(避免重复匹配) q_indices = q_indices[q_indices < last_q] i_indices = i_indices[i_indices > first_i] tx_num += 1 return group # 按id分组应用处理逻辑 df = df.groupby('id', group_keys=False).apply(process_group)
逻辑说明
- 分组初始化:每个
id分组先将tx列设为空值,仅对符合条件的区间填充编号。 - 匹配规则:从分组内最后一个未匹配的Q开始,寻找其之后的第一个I,标记两者之间的所有行为当前交易编号。
- 去重处理:每完成一组Q-I匹配后,移除已使用的Q和当前I之前的所有I,确保后续匹配不会重复覆盖已标记区间,同时交易编号自动累加。
- 边界处理:若分组内无Q或无I,或Q全部在I之后,则不标记任何交易。
结果验证
运行代码后,得到的df与预期结果一致:
- id=1、2:仅有Q无I,
tx为空; - id=6:Q出现在I之后,无有效匹配,
tx为空; - 其他无Q/I的分组,
tx均为空; - 若存在Q在I之前的分组,会正确标记对应交易区间。
内容的提问来源于stack exchange,提问作者ProcolHarum
相关产品推荐
相关产品推荐

