用Python实现数据的透视表的方法


Posted in Python onNovember 16, 2018

在处理数据时,经常需要对数据分组计算均值或者计数,在Microsoft Excel中,可以通过透视表轻易实现简单的分组运算。而对于更加复杂的分组运算,Python中pandas包可以帮助我们实现。

1 数据

首先引入几个重要的包:

import pandas as pd
import numpy as np
from pandas import DataFrame,Series

通过代码构造数据集:

data=DataFrame({'key1':['a','b','c','a','c','a','b','a','c','a','b','c'],'key2':['one','two','three','two','one','one','three','one','two','three','one','two'],'num1':np.random.rand(12),'num2':np.random.randn(12)})

得到数据集如下:

data
 key1 key2  num1  num2
0 a one 0.268705 0.084091
1 b two 0.876707 0.217794
2 c three 0.229999 0.574402
3 a two 0.707990 -1.444415
4 c one 0.786064 0.343244
5 a one 0.587273 1.212391
6 b three 0.927396 1.505372
7 a one 0.295271 -0.497633
8 c two 0.292721 0.098814
9 a three 0.369788 -1.157426

2 交叉表—分类计数

按照不同类进行计数统计是最常见透视功能,可以通

(1)crosstab

#函数:
crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)

crosstab的index和columns是必须要指定复制的参数:

pd.crosstab(data.key1,data.key2)

结果如下:

key2 one three two
key1     
a  3  1 1
b  0  1 1
c  1  1 1

想要在边框处增加汇总项可以指定margin的值为True:

pd.crosstab(data.key1,data.key2,margins=True)

结果:

key2 one three two All
key1      
a  3  1 1 5
b  1  1 1 3
c  1  1 2 4
All  5  3 4 12

(2)pivot_table

函数:

pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

使用pivot_table函数同样可以实现,运算函数默认值aggfunc='mean',指定为aggfunc='count'即可:

data.pivot_table('num1',index='key1',columns='key2',aggfunc='count')

结果相同:

key2 one three two
key1     
a  3  1 1
b  1  1 1
c  1  1 2

(3)groupby

通过groupby相对来说会更加复杂,首先需要对data按照key1和key2进行聚类,然后进行count运算,再将key2的index重塑为columns:

data.groupby(['key1','key2'])['num1'].count().unstack()

结果:

key2 one three two
key1     
a  3  1 1
b  1  1 1
c  1  1 2

3 其它透视表运算

(1)pivot_table

pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

要进行何种运算,只需要指定aggfunc即可。

默认计算均值:

data.pivot_table(index='key1',columns='key2')

out:

num1       num2     
key2  one  three  two  one  three  two
key1               
a  0.193332 0.705657 0.203155 -0.165749 2.398164 -1.293595
b  0.167947 0.204545 0.661460 0.555850 -0.522528 0.143530
c  0.496993 0.033673 0.206028 -0.115093 0.024650 0.077726

分类汇总呢并求和:

data.pivot_table(index='key1',columns='key2',aggfunc='sum')

结果:

num1       num2     
key2  one  three  two  one  three  two
key1               
a  0.579996 0.705657 0.203155 -0.497246 2.398164 -1.293595
b  0.167947 0.204545 0.661460 0.555850 -0.522528 0.143530
c  0.496993 0.033673 0.412055 -0.115093 0.024650 0.155452

也可以使用其它自定义函数:

#定义一个最大值减最小值的函数
def max_min (group):
 return group.max()-group.min()
data.pivot_table(index='key1',columns='key2',aggfunc=max_min)

结果:

num1     num2    
key2  one three two  one three  two
key1             
a  0.179266 0.0 0.000 3.109405 0.0 0.000000
b  0.000000 0.0 0.000 0.000000 0.0 0.000000
c  0.000000 0.0 0.177 0.000000 0.0 1.609466

(2)通过groupby

普通的函数如mean,sum可以直接应用:

data.groupby(['key1','key2']).mean().unstack()

返回结果:

num1       num2     
key2  one  three  two  one  three  two
key1               
a  0.193332 0.705657 0.203155 -0.165749 2.398164 -1.293595
b  0.167947 0.204545 0.661460 0.555850 -0.522528 0.143530
c  0.496993 0.033673 0.206028 -0.115093 0.024650 0.077726

以上这篇用Python实现数据的透视表的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
基于scrapy的redis安装和配置方法
Jun 13 Python
对Python中数组的几种使用方法总结
Jun 28 Python
Tornado Web Server框架编写简易Python服务器
Jul 28 Python
python实现QQ批量登录功能
Jun 19 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
Django 实现admin后台显示图片缩略图的例子
Jul 28 Python
Python的缺点和劣势分析
Nov 19 Python
python ftplib模块使用代码实例
Dec 31 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
基于Pytorch SSD模型分析
Feb 18 Python
Python Pillow(PIL)库的用法详解
Sep 19 Python
Python3 如何开启自带http服务
May 18 Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 #Python
python生成以及打开json、csv和txt文件的实例
Nov 16 #Python
python判断列表的连续数字范围并分块的方法
Nov 16 #Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 #Python
Pandas Shift函数的基础入门学习笔记
Nov 16 #Python
Python补齐字符串长度的实例
Nov 15 #Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 #Python
You might like
打造计数器DIY三步曲(中)
2006/10/09 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
js动态创建、删除表格示例代码
2013/08/07 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
详解Angular6 热加载配置方案
2018/08/18 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
Python中使用Inotify监控文件实例
2015/02/14 Python
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
python如何制作缩略图
2019/04/30 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Django Rest framework频率原理与限制
2019/07/26 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
python实现拼接图片
2020/03/23 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
如何判断计算机可能已经中马
2013/03/22 面试题
生日祝酒词大全
2015/08/10 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android