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

如何用Pandas DataFrame基于LIFO规则返回正确的待外出人员姓名?

解决方案

要实现符合LIFO(后进先出)规则的last_in_first_out()函数,核心是跟踪当前处于"IN"状态的人员,并按最后进入的顺序优先处理OUT操作。下面提供两种可行的实现方式:

方法一:使用栈模拟LIFO过程

这种方法通过遍历时间排序后的记录,用栈维护人员进入顺序,同时用集合快速判断人员状态,确保栈中始终保留当前在内部的人员:

import pandas as pd

def last_in_first_out(csv_path):
    # 读取CSV并解析时间列,确保按时间顺序处理记录
    df = pd.read_csv(csv_path, parse_dates=['Time'])
    df = df.sort_values('Time').reset_index(drop=True)
    
    # 用栈维护进入顺序,集合快速判断人员是否在内部
    in_stack = []
    in_people = set()
    
    for _, row in df.iterrows():
        name = row['Executed']
        event = row['Event']
        
        if event == 'IN':
            if name not in in_people:
                in_stack.append(name)
                in_people.add(name)
        elif event == 'OUT':
            if name in in_people:
                in_stack.remove(name)
                in_people.remove(name)
    
    # 栈顶元素即为最后进入的人员,也就是下一个需执行OUT的对象
    return in_stack[-1] if in_stack else None

逻辑说明:

  1. 先按时间排序记录,避免乱序导致状态跟踪错误;
  2. 遇到"IN"事件时,若人员不在内部则压入栈并加入集合;
  3. 遇到"OUT"事件时,从栈和集合中移除对应人员;
  4. 最终栈顶元素就是LIFO规则下的下一个OUT目标。

针对你提供的测试数据,处理后栈内剩余[Kenny, Kyle],栈顶为Kyle,符合预期;后续OUT Kyle后,栈顶变为Kenny,也符合规则。

方法二:利用Pandas分组计算状态

这种方法通过统计人员的净进出次数,结合最后一次IN的时间来确定目标,更适合熟悉Pandas分组操作的场景:

import pandas as pd

def last_in_first_out(csv_path):
    df = pd.read_csv(csv_path, parse_dates=['Time'])
    df = df.sort_values('Time')
    
    # 标记IN为+1,OUT为-1,计算每个人的净进出次数
    df['event_count'] = df['Event'].map({'IN': 1, 'OUT': -1})
    person_balance = df.groupby('Executed')['event_count'].sum()
    
    # 筛选当前处于IN状态的人员(净次数>0)
    current_in_people = person_balance[person_balance > 0].index
    
    # 获取这些人员最后一次IN的时间,按时间倒序取第一个
    last_in_records = df[df['Event'] == 'IN'].groupby('Executed')['Time'].max()
    target_person = last_in_records.loc[current_in_people].sort_values(ascending=False).index[0]
    
    return target_person if not current_in_people.empty else None

逻辑说明:

  1. 计算每个人的净进出次数,大于0说明当前在内部;
  2. 找到这些人员最后一次IN的时间,时间最晚的即为最后进入的人;
  3. 按时间倒序排序后取第一个,就是LIFO规则下的下一个OUT目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:40:31