用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小技巧分享
Nov 22 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
Python连接Mssql基础教程之Python库pymssql
Sep 16 Python
python实现矩阵打印
Mar 02 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
python opencv 简单阈值算法的实现
Aug 04 Python
Django项目中使用JWT的实现代码
Nov 04 Python
浅谈tensorflow之内存暴涨问题
Feb 05 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
python音频处理的示例详解
Dec 23 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 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 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
PHP设置一边执行一边输出结果的代码
2013/09/30 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
javascript 打印内容方法小结
2009/11/04 Javascript
Firefox中autocomplete="off" 设置不起作用Bug的解决方法
2011/03/25 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
js实现分割上传大文件
2016/03/09 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
angular动态表单制作
2018/02/23 Javascript
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
Python实现多属性排序的方法
2018/12/05 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
快速查找Python安装路径方法
2020/02/06 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Python self用法详解
2020/11/28 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
日语专业毕业生求职信
2013/12/04 职场文书
法学函授自我鉴定
2014/02/06 职场文书
大学军训感言1000字
2014/02/25 职场文书
初中家长寄语
2014/04/02 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
整理Python中常用的conda命令操作
2021/06/15 Python
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS