
本文介绍如何利用 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 向量化能力,是处理此类“累积状态+求和”问题的标准范式。










