如何基于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的向量化操作可以高效完成统计,无需循环,步骤如下:
- 筛选日期列:提取所有以
day开头的列,作为状态变化的计算范围 - 计算相邻状态差值:使用
diff(axis=1)对每行的日期列计算相邻值的差(后一天 - 前一天) - 统计进出次数:
- 进入次数(entries):差值等于1的次数(对应0→1的变化)
- 驶出次数(exits):差值等于-1的次数(对应1→0的变化)
- 合并结果到原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
相关产品推荐
相关产品推荐

