使用Python Seaborn拆分 分隔多值列、计数并绘制统计图表
实现方案
核心思路是自动按单元格内的换行分隔符拆分所有多值条目,不需要手动预设任何配料组合规则,全程自动识别所有出现过的配料,拆分后直接统计绘图即可。
关键修改点
- 读取CSV后对
Toppings列做拆分展开:以\r\n为分隔符切分每个单元格的字符串,将切分得到的多个配料转为独立行,自动清除配料名称前后多余空格、过滤空条目,全程自动识别所有出现过的配料,无需手动枚举任何组合规则。 - 绘图数据源替换为拆分后的单值配料数据集,原有样式配置、百分比标注、长标签自动换行逻辑无需改动即可复用。
- 百分比计算基数可按需调整:统计「选该配料的订单占总订单比例」时,基数取原CSV的总订单行数;统计「该配料出现次数占所有配料总出现次数比例」时,基数取拆分后的配料总条目数。
修改后完整可运行代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as ticker import seaborn as sns import math import io import textwrap %matplotlib inline sns.set_style('ticks') import warnings warnings.filterwarnings('ignore') # 读取源文件 data = pd.read_csv('E:/testing_data.csv') supplies = pd.DataFrame(data) # ---------- 多值单元格拆分逻辑 ---------- # 按\r\n分隔符拆分每个单元格的配料,展开为独立行,清理空格和空值 split_toppings = supplies['Toppings'].str.split(pat=r'\r\n').explode().str.strip() split_toppings = split_toppings[split_toppings != ''].reset_index(drop=True) # 构造拆分后的单值统计数据集 topping_stat = pd.DataFrame({'Toppings': split_toppings}) # 绘图部分 sns.set(style="darkgrid") # 基数配置:占总订单比例用len(supplies),占配料总出现次数比例用len(topping_stat) total = float(len(supplies)) ax = sns.countplot( x='Toppings', hue="Toppings", data=topping_stat, dodge=False, order = topping_stat['Toppings'].value_counts().index ) plt.legend(loc='upper right', title='Supplies Needed') plt.title('Distribution of Supplies'); plt.xlabel('Supplies', fontsize=15) plt.ylabel('Number of Occurrences', fontsize=15) plt.rcParams["figure.figsize"] = (15,10) plt.rcParams['font.size'] = '12' for p in ax.patches: percentage = '{:.1f}%'.format(100 * p.get_height()/total) x = p.get_x() + p.get_width()/2 y = p.get_height() + .01 ax.annotate(percentage, (x, y), ha='center', color='black', size=10) labels = [textwrap.fill(label.get_text(), 15) for label in ax.get_xticklabels()] ax.set_xticklabels(labels); plt.show()
效果说明
代码会自动识别所有出现过的配料,不管是单值单元格还是多值组合单元格,都会被拆成独立的配料条目统计,后续新增配料、新增组合都不需要修改代码,直接运行即可自动完成统计绘图。
内容的提问来源于stack exchange,提问作者python_newbie
相关产品推荐
相关产品推荐

