如何对分组聚合后的数据按客户细分群体分别绘制折线图
解决方法
你只需要调整分组后的数据结构,即可实现按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
相关产品推荐
相关产品推荐

