You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对分组聚合后的数据按客户细分群体分别绘制折线图

解决方法

你只需要调整分组后的数据结构,即可实现按Segment绘制多条折线,以下是两种常用实现方案:

方法1:重置索引+seaborn绘图(操作最便捷)

先把多级索引转为普通列,再通过hue参数指定按Segment区分折线:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 加载数据集
df = pd.read_csv('https://raw.githubusercontent.com/michalis0/DataMining_and_MachineLearning/master/data/sales.csv')
# 计算分组均值
average_sales = df.groupby(['Segment','OrderYear'], as_index=True)['Sales'].agg({"mean"})
# 核心操作:将二级行索引转为普通数据列
average_sales = average_sales.reset_index()

# 绘图
sns.lineplot(data=average_sales, x='OrderYear', y='mean', hue='Segment', marker='o')
plt.xlabel('年份')
plt.ylabel('平均销售额')
plt.title('不同客户类型年度平均销售额变化')
plt.legend(title='客户类型')
plt.show()

方法2:索引重排后使用pandas自带绘图

如果不想引入seaborn依赖,可以通过unstack将Segment从行索引转为列索引,pandas绘图时会自动为每一列生成一条折线:

import pandas as pd
import matplotlib.pyplot as plt

# 加载数据集
df = pd.read_csv('https://raw.githubusercontent.com/michalis0/DataMining_and_MachineLearning/master/data/sales.csv')
# 计算分组均值
average_sales = df.groupby(['Segment','OrderYear'], as_index=True)['Sales'].agg({"mean"})
# 核心操作:把Segment维度从行索引转为列索引
average_sales_unstack = average_sales['mean'].unstack(level='Segment')

# 绘图
average_sales_unstack.plot(marker='o')
plt.xlabel('年份')
plt.ylabel('平均销售额')
plt.title('不同客户类型年度平均销售额变化')
plt.legend(title='客户类型')
plt.show()

原问题原因说明

你之前只能画出一条线的核心原因是:分组后得到的是Segment和OrderYear构成的二级行索引,整张表只有mean一个数值列,直接绘图时会把这一列的所有值按索引顺序拼接为一条线。两种方案都是调整数据结构,让绘图工具可以识别到不同Segment的分组边界。

内容的提问来源于stack exchange,提问作者cped

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:54:07