Python大数据场景下Top10分类值聚合统计绘图求助
问题根因
你的代码无法实现预期效果有两个核心问题:
- 调用
sort_values()后没有将排序、取TopN的结果赋值给独立变量,链式调用执行完后结果没有被保存,无法作为绘图数据源 - 全量3000个唯一Store值直接传入绘图接口,x轴分类过多会导致刻度标签完全重叠,不具备业务可读性
可直接运行的实现方案
核心逻辑是先完成分组聚合、筛选TopN分类值,再传入绘图接口,同时通过order参数固定柱子排序规则,和参考统计图表样式对齐。
- 聚合计算采用pandas向量化操作,6万行规模数据处理耗时低于100ms,适配大数据量EDA场景
- 绘图阶段仅传入10个分类值,从根源避免x轴拥挤问题
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 读取数据 df = pd.read_csv('train_feature_store.csv') # 分组聚合Size总和,排序后取Top10门店,结果赋值保存 # 需要Top5时将head(10)改为head(5)即可 store_size_topn = df[['Size', 'Store']]\ .groupby('Store', as_index=False)\ .sum()\ .sort_values(by='Size', ascending=False)\ .head(10) # 绘图基础配置 sns.set_style("whitegrid") plt.figure(figsize=(12, 6)) # 绘制条形图,order参数固定x轴顺序为Size降序,避免自动按Store名称排序 ax = sns.barplot( data=store_size_topn, x='Store', y='Size', order=store_size_topn['Store'], palette='viridis' ) # 图表可读性优化 plt.title('Top10门店Size总和统计', fontsize=14, pad=20) plt.xlabel('门店ID', fontsize=12) plt.ylabel('Size累计值', fontsize=12) # 柱子顶部添加数值标签 for patch in ax.patches: val = patch.get_height() ax.text( patch.get_x() + patch.get_width()/2, val + store_size_topn['Size'].max()*0.01, f'{int(val)}', ha='center', fontsize=10 ) plt.xticks(rotation=45) sns.despine() plt.tight_layout() plt.show()
扩展:绘制TopN门店出现频次计数图
如果你需要的是统计门店记录数的countplot,不需要提前聚合,直接取频次TopN的门店列表传入order参数即可:
# 取记录数Top10的门店 topn_store_count = df['Store'].value_counts().head(10).index plt.figure(figsize=(12,6)) ax = sns.countplot( data=df, x='Store', order=topn_store_count, palette='viridis' ) # 标签、刻度优化逻辑和上述代码一致
内容的提问来源于stack exchange,提问作者E L
相关产品推荐
相关产品推荐

