Python 如何分别聚合度量和绘图组

Python 如何分别聚合度量和绘图组,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我有以下数据集: df = pd.DataFrame() df['year'] = [2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011] df['month'] = [1,2,3,4,5,6,1,2,3,4,5,6] df['after'] = [0,0,0,1,1,1,0,0,0,1,1,1] df['campaign'] = [0,0,0,0,0,0,1,1,1,1,1,1] df['sales'] = [10000,11

我有以下数据集:

df = pd.DataFrame()
df['year'] = [2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011]
df['month'] = [1,2,3,4,5,6,1,2,3,4,5,6]
df['after'] = [0,0,0,1,1,1,0,0,0,1,1,1]
df['campaign'] = [0,0,0,0,0,0,1,1,1,1,1,1]
df['sales'] = [10000,11000,12000,10500,10000,9500,7000,8000,5000,6000,6000,7000]
df['date_m'] = pd.to_datetime(df.year.astype(str) + '-' + df.month.astype(str))
我想做一个按月份和活动分组的折线图,所以我尝试了以下代码:

df['sales'].groupby(df['date_m','campaign']).mean().plot.line()
但是我收到了这个错误消息
keyrerror:('date\m','campaign')
。非常感谢您的帮助。

  • 打印通常取决于数据框的形状
  • .groupby
    创建了一个长格式的数据帧,这对于
    seaborn
  • .pivot\u table
    创建了一个宽格式的数据框,可以轻松地与
    pandas.DataFrame.plot一起使用
数据帧
  • df['sales'].groupby(…)
    不正确,因为
    df['sales']
    选择数据帧的一列;其他列都不可用
  • .groupby
    将数据帧转换为长格式,这非常适合使用打印。
    • 指定要通过
      “活动”
      分隔的
      hue
      参数
将熊猫作为pd导入
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
#执行groupby并重置索引
dfg=df.groupby(['date_m','campaign'])['sales'].mean().reset_index()
#显示(dfg.head())
活动销售日期
0 2011-01-01         0  10000
1 2011-01-01         1   7000
2 2011-02-01         0  11000
3 2011-02-01         1   8000
4 2011-03-01         0  12000
#与seaborn密谋
sns.lineplot(数据=dfg,x='date\u m',y='sales',hue='campaign')

数据帧
  • .pivot\u table
    正确地塑造数据框以进行打印,并且它有一个聚合参数。
    • 数据帧被塑造成宽格式
#将数据框旋转到正确的形状以便打印
dfp=df.pivot\u表(index='date\u m',columns='campaign',values='sales',aggfunc='mean')
#显示(dfp.head())
活动0 1
日期
2011-01-01  10000  7000
2011-02-01  11000  8000
2011-03-01  12000  5000
2011-04-01  10500  6000
2011-05-01  10000  6000
#绘制数据帧
dfp.plot()

直接使用
matplotlib
打印
fig,ax=plt.子批次(figsize=(8,6))
对于df.campaign.unique()中的v:
#根据活动选择数据
数据=df[df.活动等式(v)]
#仅当每个日期有多个值时才需要此选项
data=data.groupby(['date\u m','campaign'])['sales'].mean().reset\u index()
绘图('date_m','sales',data=data,label=f'{v}')
plt.legend(title='campaign')
plt.show()

笔记
  • 软件包版本:
    • 熊猫1.2.4版
    • seaborn v0.11.1
    • matplotlib v3.3.4

谢谢@Trenton McKinney,答案很好。只是一个问题,是否只有matplotlib才有可能?@Alexis pandas的后端是matplotlib。这就是pivot_表的实现。Seaborn是matplotlib的高级api。因此,这两个选项都使用matplotlib。添加了另一个直接使用matplotlib的选项,但它更麻烦。您好@Trenton McKinney,非常感谢您的回答和时间,非常有趣的是,您必须使用for循环逐个添加每个层。这澄清了我对分组变量的一些问题。再次感谢您,祝您度过愉快的一周!