4.5 创建透视表与交叉表


数据透视表(Pivot Table)是数据分析中一种常用的工具之一,根据一个或多个键值对数据进行聚合,根据行或列的分组键将数据划分到各个区域。在pandas中,除了可以使用groupby对数据分组聚合实现透视功能外,还提供了更为简单的方法。这里以菜单订单数据为例制作透视表与交叉表,分析不同菜品的销量和金额之间的关系。
(1)使用pivot_table函数制作菜品日销量透视表。
(2)使用crosstab函数制作菜品销量交叉表。

4.5.1利用pivot_table函数可以实现透视表

pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc=‘mean’, fill_value=None, margins=False, dropna=True, margins_name=‘All’)

pivot_table函数的常用参数及其说明

在这里插入图片描述

import pandas as pd
import numpy as np
detail = pd.read_csv('E:/Input/ptest.csv', encoding='ANSI')
## 1、使用订单号作为透视表索引制作透视表
# 以id作为分组键创建的订单透视表
detailPivot = pd.pivot_table(detail[['id', 'counts', 'amounts']], index='id')
print(detailPivot)

在这里插入图片描述

由上面结果可以看出,在不特殊指定聚合函数aggfunc时,会默认使用numpy.mean进行聚合运算,numpy.mean会自动过滤掉非数值类型数据。可以通过指定aggfunc参数修改聚合函数。

## 2、修改聚合函数后的透视表
# 以id作为分组键创建的订单销量与售价总和透视表
detailPivot2 =pd.pivot_table(detail[['id', 'counts', 'amounts']], index='id', aggfunc=np.sum)
print(detailPivot2)

在这里插入图片描述

和groupby方法分组的时候相同,pivot_table函数在创建透视表的时候分组键index可以有多个。

## 3、使用id和name作为索引的透视表
detailPivot3 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index=['id', 'name'], aggfunc=np.sum)
print(detailPivot3)

通过设置columns参数可以指定列分组。

## 4、指定name为列分组键的透视表
detailPivot4 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum)
print(detailPivot4)

当全部数据列数很多时,若只想要显示某列,可以通过指定values参数来实现。

## 5、指定某些列制作透视表
detailPivot5 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', values='counts', aggfunc=np.sum)
print(detailPivot5)

当某些数据不存在时,会自动填充NaN,因此可以指定fill_value参数,表示当存在缺失值时,以指定数值进行填充。

## 6、对透视表中的缺失值进行填充
detailPivot6 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum, fill_value=0)
print(detailPivot6)

可以更改margins参数,查看汇总数据。

## 7、在透视表中添加汇总数据,结果集中会出现名为All的行和列
detailPivot7 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum, 
                              fill_value=0, margins=True)
print(detailPivot7)

4.5.2 使用crosstab函数创建交叉表

交叉表是一种特殊的透视表,主要用于计算分组频率。
由于交叉表是透视表的一种,其参数基本保持一致,不同之处在于crosstab函数中的index,columns,values填入的都是对应的从Dataframe中取出的某一列。
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)

crosstab函数的常用参数及其说明

在这里插入图片描述

# 4.5.2 使用crosstab函数创建交叉表
# 4.5.2 使用crosstab函数创建交叉表
detailCross = pd.crosstab(index = detail['id'], columns=detail['name'], 
                          values=detail['counts'], aggfunc=np.sum)
print(detailCross)

4.5.3 任务实现

# 4.5.3 任务实现
## 1、创建单日菜品成交总额与总数均价透视表
import pandas as pd
import numpy as np
detail = pd.read_csv('E:/Input/ptest.csv', encoding='ANSI')
# print(detail)
detail['time'] = pd.to_datetime(detail['time'])
detail['date'] = [i.date() for i in detail['time']]
# print(detail['date'])
PivotDetail = pd.pivot_table(detail[['date', 'name', 'counts', 'amounts']],
                             index='date', aggfunc=np.sum, margins=True)
print(PivotDetail)
# 2、创建单个菜品单日成交总额透视表
## 方法1
PivotDetail2 = pd.pivot_table(detail[['date', 'name', 'amounts']],
                              index='date',columns='name', aggfunc=np.sum, margins=True)
print(PivotDetail2)
## 方法2
CrossDetail2 = pd.crosstab(index=detail['date'], columns=detail['name'],
                           values=detail['amounts'], aggfunc=np.sum, margins=True)
print(CrossDetail2)

数据

链接:https://pan.baidu.com/s/1FPQFA8JJHuezxbpQIHiZ4Q
提取码:6666

完整代码

import pandas as pd
import numpy as np
detail = pd.read_csv('E:/Input/ptest.csv', encoding='ANSI')
print(detail)
## 1、使用订单号作为透视表索引制作透视表
# 以id作为分组键创建的订单透视表
detailPivot = pd.pivot_table(detail[['id', 'counts', 'amounts']], index='id')
print(detailPivot)

## 2、修改聚合函数后的透视表
# 以id作为分组键创建的订单销量与售价总和透视表
detailPivot2 =pd.pivot_table(detail[['id', 'counts', 'amounts']], index='id', aggfunc=np.sum)
print(detailPivot2)

## 3、使用id和name作为索引的透视表
detailPivot3 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index=['id', 'name'], aggfunc=np.sum)
print(detailPivot3)

## 4、指定name为列分组键的透视表
detailPivot4 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum)
print(detailPivot4)

## 5、指定某些列制作透视表
detailPivot5 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', values='counts', aggfunc=np.sum)
print(detailPivot5)

## 6、对透视表中的缺失值进行填充
detailPivot6 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum, fill_value=0)
print(detailPivot6)

## 7、在透视表中添加汇总数据,结果集中会出现名为All的行和列
detailPivot7 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum, 
                              fill_value=0, margins=True)
print(detailPivot7)

# 4.5.2 使用crosstab函数创建交叉表
detailCross = pd.crosstab(index=detail['id'], columns=detail['name'],
                          values=detail['counts'], aggfunc=np.sum)
print(detailCross)

# 4.5.3 任务实现
## 1、创建单日菜品成交总额与总数均价透视表
import pandas as pd
import numpy as np
detail = pd.read_csv('E:/Input/ptest.csv', encoding='ANSI')
# print(detail)
detail['time'] = pd.to_datetime(detail['time'])
detail['date'] = [i.date() for i in detail['time']]
# print(detail['date'])
PivotDetail = pd.pivot_table(detail[['date', 'name', 'counts', 'amounts']],
                             index='date', aggfunc=np.sum, margins=True)
print(PivotDetail)
# 2、创建单个菜品单日成交总额透视表
## 方法1
PivotDetail2 = pd.pivot_table(detail[['date', 'name', 'amounts']],
                              index='date',columns='name', aggfunc=np.sum, margins=True)
print(PivotDetail2)
## 方法2
CrossDetail2 = pd.crosstab(index=detail['date'], columns=detail['name'],
                           values=detail['amounts'], aggfunc=np.sum, margins=True)
print(CrossDetail2)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清木!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值