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

如何识别序列顺序并累加标记交易?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:25:38