用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 linecache.getline()读取文件中特定一行的脚本
Sep 06 Python
Python获取Windows或Linux主机名称通用函数分享
Nov 22 Python
Python判断Abundant Number的方法
Jun 15 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
python使用pygame框架实现推箱子游戏
Nov 20 Python
Django restframework 源码分析之认证详解
Feb 22 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
基于h5py的使用及数据封装代码
Dec 26 Python
python 弧度与角度互转实例
Apr 15 Python
python 元组的使用方法
Jun 09 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 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动态生成VRML网页
2006/10/09 PHP
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
React-router4路由监听的实现
2018/08/07 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
Python程序设计入门(4)模块和包
2014/06/16 Python
Python 正则表达式(转义问题)
2014/12/15 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
python多线程与多进程及其区别详解
2019/08/08 Python
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
英语专业个人求职信范文
2014/02/01 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
查摆剖析材料范文
2014/09/30 职场文书
婚前财产协议书范本
2014/10/19 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
捐书活动倡议书
2015/04/27 职场文书
python编写函数注意事项总结
2021/03/29 Python
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技