如何在绘图时筛选特定Event(Speeding)计算平均速度?
问题描述
我有如下CSV数据:
| Time | Event | Speed |
|---|---|---|
| 1/30/2022 17:23 | Speeding | 50 |
| 1/28/2022 18:22 | Speeding | 20 |
| 1/27/2022 22:00 | Speeding | 30 |
| 1/26/2022 23:23 | Speeding | 40 |
| 1/27/2022 22:00 | Stopping | 10 |
| 1/26/2022 23:23 | Stopping | 10 |
当前我的代码会计算所有Event的平均速度,并以24小时格式的时间为X轴、平均速度为Y轴绘图。但我只想从该CSV中获取Event为“Speeding”的平均速度,而非所有事件的平均速度。
我尝试了如下筛选代码:
event_filter = df["Event"] == "Speeding" dr = df[event_filter] grouped_by_event1 = dr.groupby('Event')[['Speed']]
当前绘制所有事件平均速度的代码:
import pandas as pd from bokeh.plotting import figure, output_file, show from bokeh.models import ColumnDataSource, HoverTool output_file('Speed.html') # output for average speed graph file = 'C:/Users/oof/Desktop/route.csv' df = pd.read_csv(file) df['Time'] = pd.to_datetime(df['Time'], format='%m/%d/%Y %H:%M').dt.time grouped_by_time = df.groupby('Time')[['Speed']].mean() print(grouped_by_time) source1 = ColumnDataSource(grouped_by_time) p1 = figure(x_axis_type='datetime') p1.line(x='Time', y='Speed', line_width=2, source=source1) p1.title.text = 'Average Speed in a Day' p1.yaxis.axis_label = 'Average Speed' p1.xaxis.axis_label = '24-Hour' p1.xaxis.major_label_overrides = {0: '0h', 24*60*60*1000: '24h'} TOOLTIP1 = [("Time", "@Time{%H:%M}"), ("Average Speed", "@Speed")] p1.add_tools(HoverTool(tooltips=TOOLTIP1, formatters={"@Time": "datetime"}, mode='vline')) show(p1)
解决方案
只需在处理时间列之前,先筛选出Event为Speeding的行,后续再按时间分组计算平均速度即可。修改后的完整代码如下:
import pandas as pd from bokeh.plotting import figure, output_file, show from bokeh.models import ColumnDataSource, HoverTool output_file('Speed.html') # 输出平均速度图表 file = 'C:/Users/oof/Desktop/route.csv' df = pd.read_csv(file) # 筛选出Event为Speeding的记录 df = df[df["Event"] == "Speeding"] # 处理时间列并按时间分组计算平均速度 df['Time'] = pd.to_datetime(df['Time'], format='%m/%d/%Y %H:%M').dt.time grouped_by_time = df.groupby('Time')[['Speed']].mean() print(grouped_by_time) source1 = ColumnDataSource(grouped_by_time) p1 = figure(x_axis_type='datetime') p1.line(x='Time', y='Speed', line_width=2, source=source1) p1.title.text = '超速事件的日均平均速度' p1.yaxis.axis_label = '平均速度' p1.xaxis.axis_label = '24小时制时间' p1.xaxis.major_label_overrides = {0: '0h', 24*60*60*1000: '24h'} TOOLTIP1 = [("时间", "@Time{%H:%M}"), ("平均速度", "@Speed")] p1.add_tools(HoverTool(tooltips=TOOLTIP1, formatters={"@Time": "datetime"}, mode='vline')) show(p1)
关键修改说明
- 提前添加筛选逻辑
df = df[df["Event"] == "Speeding"],直接过滤掉非超速记录,后续所有计算仅基于超速事件。 - 同步修改了图表的标题、轴标签和提示文本为中文(若不需要可自行改回英文)。
内容的提问来源于stack exchange,提问作者WJstudent
相关产品推荐
相关产品推荐

