如何用Pandas高效统计红绿灯时段车辆检测占比?
基于Pandas的红绿灯时段车辆检测数据高效统计方案
核心思路
通过状态填充+分组统计的矢量化操作替代逐行循环,利用Pandas内置方法高效完成状态标记与统计:
- 先标记所有红绿灯切换事件的状态
- 用向前填充(
ffill())为后续所有事件继承最近的红绿灯状态 - 筛选车辆检测事件后按状态分组统计
具体实现步骤
假设你的CSV数据包含Event Code列(事件编码),且数据已按时间顺序排列(若未排序,需先按时间列排序):
读取并预处理数据
import pandas as pd # 读取CSV文件 df = pd.read_csv("your_data.csv") # 若数据未按时间排序,执行以下代码(假设时间列名为'timestamp') # df = df.sort_values('timestamp')标记并填充红绿灯状态
创建light_state列标记切换事件,再通过向前填充让后续事件继承最近的红绿灯状态:# 初始化状态列 df['light_state'] = None # 标记绿灯启动事件 df.loc[df['Event Code'] == 1, 'light_state'] = 'green' # 标记红灯启动事件 df.loc[df['Event Code'] == 10, 'light_state'] = 'red' # 向前填充状态,补全所有事件的红绿灯状态 df['light_state'] = df['light_state'].ffill()统计各时段车辆数量与占比
筛选车辆检测事件后分组统计,再计算绿灯占比:# 筛选所有车辆检测事件 vehicle_data = df[df['Event Code'] == 82] # 按红绿灯状态分组计数 state_counts = vehicle_data['light_state'].value_counts().reset_index() state_counts.columns = ['light_state', 'vehicle_count'] # 提取统计结果 green_count = state_counts.loc[state_counts['light_state'] == 'green', 'vehicle_count'].values[0] red_count = state_counts.loc[state_counts['light_state'] == 'red', 'vehicle_count'].values[0] total_count = green_count + red_count green_percent = (green_count / total_count) * 100输出结果
print(f"绿灯时段检测车辆数:{green_count}") print(f"红灯时段检测车辆数:{red_count}") print(f"绿灯时段车辆占比:{green_percent:.1f}%")
方案优势
- 基于Pandas矢量化操作,避免逐行循环的高时间复杂度,大数据量下性能提升显著
- 逻辑清晰、代码简洁,后续扩展其他状态统计需求时易维护
内容的提问来源于stack exchange,提问作者Sphynx
相关产品推荐
相关产品推荐

