如何用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
逻辑说明:
- 先按时间排序记录,避免乱序导致状态跟踪错误;
- 遇到"IN"事件时,若人员不在内部则压入栈并加入集合;
- 遇到"OUT"事件时,从栈和集合中移除对应人员;
- 最终栈顶元素就是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
逻辑说明:
- 计算每个人的净进出次数,大于0说明当前在内部;
- 找到这些人员最后一次IN的时间,时间最晚的即为最后进入的人;
- 按时间倒序排序后取第一个,就是LIFO规则下的下一个OUT目标。
内容的提问来源于stack exchange,提问作者user18767111
相关产品推荐
相关产品推荐

