Python如何绘制并分析DataFrame中餐厅营业高峰时段列表数据
餐厅高峰时段可视化解决方案
前提说明
现有数据包含3个字段:餐厅(Restaurants)、日期(Day)、高峰时段(busy_hours),其中busy_hours存储为数值列表,现有散点图无法满足分析需求,且空时段条目会干扰统计。
第一步:数据预处理
原有代码仅过滤了NaN值,无法过滤busy_hours为空列表的条目,且列表格式的字段无法直接用于可视化,需要先做如下处理:
- 将CSV读取后默认是字符串格式的
busy_hours转换为Python数值列表 - 过滤
busy_hours为空的所有行 - 将列表拆分为长表格式,每一行对应单条餐厅+日期+单个高峰时段的记录
预处理代码如下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import ast # 读取数据 df = pd.read_csv("template (3).csv") # 转换busy_hours从字符串列表到真实列表(CSV读取时列表会被识别为字符串) df['busy_hours'] = df['busy_hours'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else x) # 过滤空高峰时段的条目 df = df[df['busy_hours'].apply(len) > 0] # 拆分为长表 df_explode = df.explode('busy_hours', ignore_index=True) # 确保时段是数值类型 df_explode['busy_hours'] = df_explode['busy_hours'].astype(int)
第二步:可选可视化方案
方案1:分餐厅高峰时段频次热力图
适合直观展示各餐厅全时段的高峰出现频率:
# 统计每个餐厅各时段出现的次数 heatmap_data = df_explode.groupby(['Restaurants', 'busy_hours']).size().unstack(fill_value=0) plt.figure(figsize=(16, 8), dpi=80) sns.heatmap(heatmap_data, cmap='Reds', annot=True, fmt='d') plt.xlabel('高峰时段(小时)') plt.ylabel('餐厅名称') plt.title('各餐厅高峰时段出现频次热力图') plt.show()
方案2:分餐厅高峰时段分布群图
适合展示各餐厅高峰时段的分布离散情况,可叠加日期维度分组:
plt.figure(figsize=(16, 7), dpi=80) sns.swarmplot(data=df_explode, x='Restaurants', y='busy_hours', size=8, alpha=0.7) # 如果需要按日期区分颜色可改为: # sns.swarmplot(data=df_explode, x='Restaurants', y='busy_hours', hue='Day', size=8, alpha=0.7) plt.xlabel('餐厅名称') plt.ylabel('高峰时段(小时)') plt.title('各餐厅高峰时段分布') plt.xticks(rotation=45) plt.show()
注意事项
- 若运行时提示字段不存在,请注意检查
Restaurants字段的拼写是否和CSV文件中一致 - 如果你的
busy_hours字段存储的是0-23的24小时制数值,上述代码可直接运行,若为其他格式需先做数值映射 - 若需要按星期几聚合分析,可先将
Day字段转换为星期类别后再分组统计
内容的提问来源于stack exchange,提问作者micheal
相关产品推荐
相关产品推荐

