用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 相关文章推荐
Python复制目录结构脚本代码分享
Mar 06 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
用pycharm开发django项目示例代码
Oct 24 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
如何提高python 中for循环的效率
Apr 15 Python
聊聊python在linux下与windows下导入模块的区别说明
Mar 03 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
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
vue实现扫码功能
2020/01/17 Javascript
JS实现放烟花效果
2020/03/10 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
详解Django CAS 解决方案
2019/10/30 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
人大调研汇报材料
2014/08/14 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
二胎满月酒致辞
2015/07/29 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
redis实现共同好友的思路详解
2021/05/26 Redis
Python实现照片卡通化
2021/12/06 Python
Nginx的gzip相关介绍
2022/05/11 Servers
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS