用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中的round()方法
May 15 Python
在Django框架中伪造捕捉到的URLconf值的方法
Jul 18 Python
使用python实现个性化词云的方法
Jun 16 Python
python实现闹钟定时播放音乐功能
Jan 25 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
python async with和async for的使用
Jun 20 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
python getopt模块使用实例解析
Dec 18 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 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
mysql 字段类型说明
2007/04/27 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
简单谈谈php延迟静态绑定
2016/01/26 PHP
Jquery 表格合并的问题分享
2011/09/17 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
解决python中无法自动补全代码的问题
2018/12/04 Python
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
大学自我鉴定
2013/12/20 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
爱国主义演讲稿
2014/05/07 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
雷峰塔导游词
2015/02/09 职场文书
董事长致辞
2015/07/29 职场文书
新兵入伍决心书
2015/09/22 职场文书
2016新年晚会开场白
2015/12/03 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
Java中API的使用方法详情
2022/04/06 Java/Android