当前位置:   article > 正文

Pandas数据透视表--pivot_table_pivot table

pivot table

导语:

数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等。所进行的计算与数据跟数据透视表中的排列有关。之所以称为数据透视表,是因为可以动态地改变它们的版面布置,以便按照不同方式分析数据,也可以重新安排行号、列标和页字段。每一次改变版面布置时,数据透视表会立即按照新的布置重新计算数据。另外,如果原始数据发生更改,则可以更新数据透视表。在使用Excel做数据分析时,透视表是很常用的功能,Pandas也提供了透视表功能,对应的API为pivot_table

一.pivot_table函数介绍

pandas有两个pivot_table函数,pandas.pivot_table和pandas.DataFrame.pivot_table,

pandas.pivot_table 比 pandas.DataFrame.pivot_table 多了一个参数data,data就是一个dataframe,实际上这两个函数相同。

pivot_table参数中最重要的四个参数 values,index,columns,aggfunc,下面通过案例介绍pivot_tabe的使用

二.零售会员数据案例分析

某女鞋连锁零售企业,当前业务以线下门店为主,线上销售为辅,通过对会员的注册数据以及的分析,监控会员运营情况,为后续会员运营提供决策依据

会员等级说明:

① 白银: 注册(0)

② 黄金: 下单(1~3888)

③ 铂金: 3888~6888

④ 钻石: 6888以上

数据分析要达到的目标:

描述性数据分析,使用业务数据分析出会员运营的基本情况

案例中用到的数据为:

① 会员信息查询.xlsx

② 会员消费报表.xlsx

③ 门店信息表.xlsx

④ 全国销售订单数量表.xlsx

这些文件已经加载在资源里了,读者可自行下载。

三.需求实现

首先我们导入数据:

  1. import pandas as pd
  2. data = pd.read_excel('会员信息查询.xlsx')
  3. data

结果如图所示:

需求1:按月统计注册的会员数量

  1. import pandas as pd
  2. import numpy as np
  3. data = pd.read_excel('会员信息查询.xlsx')
  4. data.loc[:, '注册年月'] = data['注册时间'].apply(lambda x: x.strftime('%Y-%m'))
  5. a = data.pivot_table(index='注册年月', values='会员卡号', aggfunc='count')
  6. a.rename(columns={'会员卡号': '会员人数'}, inplace=True)
  7. a

可得运行结果为:

通过matplotlib.pyplot对上述数据进行可视化,代码为:

  1. import matplotlib.pyplot as plt
  2. plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字
  3. plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
  4. a.index=a.index.to_timestamp()
  5. a.plot()

可得:

这样我们就完成了按月统计注册的会员数量的需求

需求2:增量等级分布

所谓增量等级分布就是指各个等级(会员等级,有白银黄金铂金钻石)在各个月的增量,代码如下:

  1. data.loc[:, '注册年月'] = data['注册时间'].apply(lambda x: x.strftime('%Y-%m'))
  2. member_rating = data.pivot_table(index='注册年月', columns='会员等级', values='会员卡号', aggfunc='count')
  3. member_rating = member_rating[1:]
  4. member_rating

这里我们以注册年月为索引,会员等级为列,然后对会员卡号进行统计,进而可以求出各个等级在每月的的分布情况,运行结果如下:

将上述结果进行可视化,代码如下:

  1. # fig: 画布, axes(坐标系, x轴, y周), dpi: 帧率
  2. fig, ax1 = plt.subplots(figsize=(20,5),dpi=100) #构建坐标系
  3. # ax1坐标系作用于: '白银会员','黄金会员'会员.
  4. # ax2坐标系作用于: '铂金会员','钻石会员' 因为它们的占比比较少.
  5. ax2 = ax1.twinx() #构建双胞胎坐标系
  6. # rot=0 x轴值的旋转度, grid = True 显示表格, legend=True 显示图例
  7. member_rating[['白银会员','黄金会员']].plot.bar(ax = ax1,rot=0,grid = True,xlabel='年月',ylabel = '白银黄金',legend=True)
  8. member_rating[['铂金会员','钻石会员']].plot(ax = ax2,color = ['red','gray'],ylabel='铂金钻石')
  9. ax2.legend(loc='upper left') # 把ax2坐标系的图例,location(位置): 左上.
  10. plt.title("会员增量等级分布",fontsize=20)

由于白银黄金会员数量较多,而铂金钻石会员数量较少,所以我们在上述代码中使用双y轴的形式,来对数据进行可视化画图,运行结果如下:

需求3:增量等级占比分析

求增量等级占比的意思就是求各个月各个等级的会员数量占会员总数的比例,这里我们可以用sum函数,计算出各个等级的会员总数,然后新增列,代码如下:

  1. #需求3:增量等级占比分析
  2. import matplotlib.pyplot as plt
  3. data=dat.copy()
  4. data.loc[:,'注册年月']=data['注册时间'].apply(lambda x:x.strftime('%Y-%m'))
  5. data=data.pivot_table(index='注册年月',columns='会员等级',values='会员卡号',aggfunc='count')
  6. # data.drop('总计',axis='columns')
  7. data.loc[:,'总计']=data.sum(axis='columns')
  8. data.loc[:,'白银会员占比']=data['白银会员'].div(data['总计'])
  9. data.loc[:,'黄金会员占比']=data['黄金会员'].div(data['总计'])
  10. data.loc[:,'铂金会员占比']=data['铂金会员'].div(data['总计'])
  11. data.loc[:,'钻石会员占比']=data['钻石会员'].div(data['总计'])
  12. data

上述代码运行结果如下:

将数据进行可视化,这里我们依然进行双y轴设置,可视化代码如下:

  1. # 创建一个图表对象和两个y轴对象
  2. fig, ax1 = plt.subplots(figsize=(15, 8))
  3. ax2 = ax1.twinx()
  4. # 绘制柱状图,使用第二个y轴对象ax2,设置y轴标签为'铂金钻石',颜色为黑色和灰色
  5. data[['铂金会员占比', '钻石会员占比']].plot.bar(ax=ax2, ylabel='铂金钻石', color=['black', 'grey'])
  6. # 绘制折线图,使用第一个y轴对象ax1,设置x轴标签为'注册年月',y轴标签为'白银黄金',
  7. # 折线图顺序设置为500,颜色为红色和蓝色
  8. data[['白银会员占比', '黄金会员占比']].plot(ax=ax1, xlabel='注册年月', ylabel='白银黄金', marker='o', color=['r', 'b'], zorder=500)
  9. # 设置图例位置为左上角
  10. ax2.legend(loc='upper left')

运行效果如下:

需求4:计算各级会员占比

计算各级会员占比需要先根据会员等级进行统计,然后统计会员总人数,再调用div函数对各级会员和会员总人数求商即可,代码如下:

  1. #%%
  2. #需求4:计算各级会员占比
  3. data=dat.copy()
  4. data=data.pivot_table(index='会员等级',values='会员卡号',aggfunc='count')
  5. s=data['会员卡号'].sum()
  6. data.loc[:,'各级会员占比']=data['会员卡号'].div(s)
  7. data=data.reindex(['白银会员','黄金会员','铂金会员','钻石会员'])
  8. data

上述代码的运行结果为:

对数据进行可视化,我们使用折线图:

data['各级会员占比'].plot(figsize=(18,8),marker='o')

运行结果为:

需求5:线上线下增量分析

使用pivot_table方法,以年月为索引,会员来源为列名,然后统计每年各种来源的会员人数变化即可,代码如下:

  1. import matplotlib.pyplot as plt
  2. import pandas as pd
  3. dat = pd.read_excel('会员信息查询.xlsx')
  4. data=dat.copy()
  5. data.loc[:,'注册年月']=data['注册时间'].apply(lambda x:x.strftime('%Y-%m'))
  6. data=data.pivot_table(index='注册年月',columns='会员来源',values='会员卡号',aggfunc='count')
  7. data

运行结果为:

对数据进行可视化操作,绘制折线图,由于2017年8月的数据量太大,所以剔除后绘图,代码如下:

  1. data=data[1:]
  2. data.plot(figsize=(18,8))

运行结果为:

 四.总结

通过以上需求我们可以发下,透视表的方法可以很方便的对数据进行分析,只需要在pivot_table中传入index,columns,参数对行列进行划分,然后values传入要统计的值,而aggfunc则只需要传入聚合方法即可,同学们应多多练习,理解掌握这种方法,这样有助于快速实现需求。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/657025
推荐阅读