计算 Pandas 中人员在园区内累计停留总天数的高效方法

16次阅读

计算 Pandas 中人员在园区内累计停留总天数的高效方法

本文介绍如何利用 pandas 的 cumsum 和向量化运算,高效计算每日在园人数及所有人累计停留天数,避免循环,一行代码即可完成核心逻辑。

在人员进出管理类场景(如园区、宿舍、实验室门禁)中,常需统计“所有人累计停留天数”——即每天在园人数之和。给定每日新增入场人数(entry_persons)与离场人数(exit_persons),关键在于:每日在园人数 = 上日累计在园人数 + 今日入场 − 今日离场,这本质上是一个带初始值的累积差分过程。

Pandas 提供了简洁高效的解决方案。首先,计算每日净变化量(入场减离场),再对其做累积和(cumsum),即可得到每日实时在园人数:

import pandas as pd  df = pd.DataFrame({'day': [1, 2, 3, 4, 5],     'entry_persons': [4, 2, 3, 5, 0],     'exit_persons': [0, 1, 4, 0, 1] })  # 计算每日在园人数 df['total'] = df['entry_persons'].sub(df['exit_persons']).cumsum() print(df)

输出:

day  entry_persons  exit_persons  total 0    1              4             0      4 1    2              2             1      5 2    3              3             4      4 3    4              5             0      9 4    5              0             1      8

该结果与题目示例完全一致:第 1 天 4 人、第 2 天 5 人……第 5 天 8 人。

若只需最终累计停留总天数(即所有人在园天数之和),直接对 total 列求和即可:

total_days = df['total'].sum()  # 输出:30

或一步到位(推荐):

total_days = df['entry_persons'].sub(df['exit_persons']).cumsum().sum()

⚠️ 注意事项:

  • 此方法隐含假设 第 0 天在园人数为 0 (即无历史滞留人员)。如有初始在园人数(如 initial = 2),可调整为:
    df[‘total’] = (df[‘entry_persons’].sub(df[‘exit_persons’]).cumsum() + initial)
  • exit_persons 不得超过当日及此前累计在园人数(业务合理性需前置校验,Pandas 不自动检查);
  • 若存在跨日离场延迟等复杂逻辑(如 T + 1 离场),则需转为事件驱动建模,而非简单按日累加。

该方案时间复杂度 O(n),无显式循环,充分利用 Pandas 向量化能力,是处理此类“累积状态 + 求和”问题的标准范式。

text=ZqhQzanResources