Pandas DataFrame 订单列统计重复单品频次并绘制柱状图问题
拆分统计订单单品频次并绘制柱状图的实现方法
问题原因
此前使用groupby结合count无法得到单品频次的核心逻辑问题是:分组匹配的基准是整行单元格的完整订单文本,只有内容完全一致的整段订单会被归为同一组计数,不会拆分单元格内存储的多个独立单品,最终得到的是整单的分布统计,而非单个单品的出现频次。
实现步骤
1. 加载依赖与示例数据
import pandas as pd import matplotlib.pyplot as plt # 解决中文显示异常 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 导入示例数据集 data = { "Customer name": ["Sam Doe", "John Doe", "Sammy Doe", "Jonny Doe"], "Order": [ "Donut L, Burger L, Burger M", "Burger M", "Burger M, Donut L", "Burger L" ] } df = pd.DataFrame(data)
2. 拆分订单内的独立单品
对Order列的文本按逗号拆分,同时清除每个拆分后元素的前后空白,避免因空格差异将同一款单品识别为不同值:
# 按逗号拆分订单文本,清理每个单品的前后空格 split_orders = df["Order"].str.split(",").apply( lambda items: [item.strip() for item in items] ) # 将每行的单品列表展开为独立行 all_items = split_orders.explode()
3. 统计单品累计出现频次
展开后的序列中每个元素对应一笔独立的单品订单,直接调用value_counts()即可快速得到各单品的累计出现次数:
item_counts = all_items.value_counts().sort_values(ascending=False)
针对给出的示例数据集,统计结果为:
Burger M:累计出现3次Donut L:累计出现2次Burger L:累计出现2次
4. 绘制柱状图可视化
基于统计结果直接绘制柱状图即可:
plt.figure(figsize=(9, 5)) item_counts.plot(kind="bar", color="#4895ef", width=0.6) plt.xlabel("T恤单品(设计+尺码)") plt.ylabel("累计订购次数") plt.title("各款T恤单品累计订购量统计") plt.xticks(rotation=0) plt.tight_layout() plt.show()
注意事项
- 拆分后必须对每个单品做前后空格清理:原始订单中逗号分隔的单品通常带有后置空格,不清理会导致
Burger M和Burger M被判定为两个独立值,造成统计结果失真。 - 如果实际数据中订单的分隔符不统一,可将
str.split()内的分隔符替换为实际使用的字符,适配不同的订单文本格式。
内容的提问来源于stack exchange,提问作者Penny Pang
相关产品推荐
相关产品推荐

