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

如何基于DataFrame统计车辆进出停车场的状态变化次数?

统计车辆停车场进出状态变化次数的简洁实现

问题背景

现有如下结构的DataFrame df,包含车辆ID、城市及每日进出停车场的状态(1表示在场,0表示离场):

ID City day1 day2 day3 day4 day5 day6 day7
1  NYC  1    0    1    1    0    1    1
2  BOS  0    1    1    0    0    1    0
3  SFO  1    1    0    0    0    0    0
4  SFO  1    1    1    1    1    1    1
4  NYC  1    0    0    1    0    1    1

需要统计每辆车在对应城市的进入次数(状态从0→1的变化)和驶出次数(状态从1→0的变化),最终得到如下结果:

ID City day1 day2 day3 day4 day5 day6 day7 entries exits
1  NYC  1    0    1    1    0    1    1    2       2
2  BOS  0    1    1    0    0    1    0    2       2
3  SFO  1    1    0    0    0    0    0    0       1
4  SFO  1    1    1    1    1    1    1    0       0
4  NYC  1    0    0    1    0    1    1    2       2

原计划通过循环日期列生成差值变量统计,但该方法繁琐,寻求更简洁的实现方式。

解决方案

利用Pandas的向量化操作可以高效完成统计,无需循环,步骤如下:

  1. 筛选日期列:提取所有以day开头的列,作为状态变化的计算范围
  2. 计算相邻状态差值:使用diff(axis=1)对每行的日期列计算相邻值的差(后一天 - 前一天)
  3. 统计进出次数:
    • 进入次数(entries):差值等于1的次数(对应0→1的变化)
    • 驶出次数(exits):差值等于-1的次数(对应1→0的变化)
  4. 合并结果到原DataFrame:将统计得到的entries和exits列添加到原数据中

完整代码

import pandas as pd

# 构造示例数据
data = {
    'ID': [1,2,3,4,4],
    'City': ['NYC','BOS','SFO','SFO','NYC'],
    'day1': [1,0,1,1,1],
    'day2': [0,1,1,1,0],
    'day3': [1,1,0,1,0],
    'day4': [1,0,0,1,1],
    'day5': [0,0,0,1,0],
    'day6': [1,1,0,1,1],
    'day7': [1,0,0,1,1]
}
df = pd.DataFrame(data)

# 提取日期列
day_cols = [col for col in df.columns if col.startswith('day')]

# 计算状态差值
diff_df = df[day_cols].diff(axis=1)

# 统计进出次数
df['entries'] = (diff_df == 1).sum(axis=1)
df['exits'] = (diff_df == -1).sum(axis=1)

# 查看结果
print(df)

代码说明

  • diff(axis=1):按行方向计算相邻列的差值,自动忽略每行的第一个元素(因为没有前一个值),刚好符合从day1到day2的变化统计需求
  • 向量化统计:(diff_df == 1).sum(axis=1)直接对每行统计满足条件的次数,比循环效率高得多,尤其当日期列数量很大时优势明显

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:20:42