如何将Pandas销售数据转换为按员工分组的2×2饼图报告?
需求:为每位员工生成水果销量饼图并组合成2×2子图
数据样本
import pandas as pd import matplotlib.pyplot as plt data = {'Day': ['Monday', 'Monday', 'Monday', 'Monday', 'Tuesday', 'Tuesday', 'Tuesday', 'Tuesday', 'Tuesday', 'Tuesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Thursday', 'Thursday', 'Thursday', 'Thursday', 'Thursday', 'Friday', 'Friday', 'Friday', 'Friday'], 'Employee': ['Jack','Jill','Fred','Ginger','Jack','Jill','Jill','Fred','Ginger','Ginger','Jack','Jack','Jill','Jill','Jill','Fred','Fred','Ginger','Jack','Jill','Fred','Ginger','Jack','Jill','Fred','Fred','Ginger'], 'Fruit': ['Apples','Oranges ','Pears','Apples','Oranges ','Pears','Apples','Oranges ','Pears','Apples','Oranges ','Pears','Apples','Oranges ','Pears','Apples','Oranges ','Pears','Apples','Oranges ','Pears','Apples','Oranges ','Pears','Apples','Oranges ','Pears'], 'Qty': ['2','4','3','5','1','2','4','2','3','5','3','1','2','4','1','5','2','1','4','3','1','5','4','1','2','4','2'] } df = pd.DataFrame(data)
已完成操作
已通过以下代码提取每位员工各类水果的总销量:
df.groupby(['Employee','Fruit'])['Qty'].sum()
需求说明
希望为每位员工生成对应水果销量的饼图,并将这些饼图组合成2×2的子图布局,不确定是否需要将水果名称设为列索引,求最优实现方法。
最优实现方法
步骤1:数据预处理
首先要把Qty列转换成数值类型(当前是字符串格式),然后将分组结果重塑为宽表——把水果作为列索引、员工作为行索引,这是后续绘图最便捷的数据结构:
# 转换Qty为数值型,避免求和时出现字符串拼接问题 df['Qty'] = df['Qty'].astype(int) # 分组求和后用unstack()转成宽表 employee_fruit_sales = df.groupby(['Employee', 'Fruit'])['Qty'].sum().unstack()
步骤2:创建2×2子图并绘制饼图
用matplotlib的subplots创建布局,遍历每位员工的数据绘制饼图即可:
# 创建2行2列的子图,设置整体画布大小 fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8)) # 将二维子图数组展平,方便后续遍历 axes = axes.flatten() # 获取所有员工的列表 employees = employee_fruit_sales.index.tolist() # 遍历员工和对应子图,逐个绘制饼图 for ax, employee in zip(axes, employees): sales_data = employee_fruit_sales.loc[employee] # 绘制饼图,添加标签和百分比显示,startangle让饼图从顶部开始 ax.pie(sales_data, labels=sales_data.index, autopct='%1.1f%%', startangle=90) ax.set_title(f'{employee}的水果销量占比') # 自动调整子图间距,避免标题和饼图重叠 plt.tight_layout() plt.show()
关键说明
- 用
unstack()转宽表是最优选择:无需手动调整索引,转换后每个员工的水果销量会以列的形式呈现,直接通过行索引就能定位单个员工的所有数据,绘图逻辑清晰简洁。 - 如果后续员工数量超过4位,只需调整
nrows和ncols的数值即可扩展布局,灵活性很高。
内容的提问来源于stack exchange,提问作者user2003052
相关产品推荐
相关产品推荐

