用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 相关文章推荐
写了个监控nginx进程的Python脚本
May 10 Python
python冒泡排序算法的实现代码
Nov 21 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
python实现年会抽奖程序
Jan 22 Python
Python中print和return的作用及区别解析
May 05 Python
完美解决python3.7 pip升级 拒绝访问问题
Jul 12 Python
Python单元测试工具doctest和unittest使用解析
Sep 02 Python
python通过链接抓取网站详解
Nov 20 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
python使用建议与技巧分享(二)
Aug 17 Python
Python urllib3软件包的使用说明
Nov 18 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 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下正则来匹配dede模板标签的代码
2010/08/21 PHP
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
JS面向对象编程详解
2016/03/06 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
详解Vue中watch的详细用法
2018/11/28 Javascript
js实现手表表盘时钟与圆周运动
2020/09/18 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
python实现中文转换url编码的方法
2016/06/14 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
CentOS 7下安装Python3.6 及遇到的问题小结
2018/11/08 Python
Python多进程fork()函数详解
2019/02/22 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
极简的HTML5模版
2015/07/09 HTML / CSS
Asics日本官网:鬼冢八喜郎创立的跑鞋运动品牌
2017/10/18 全球购物
什么是servlet链?
2014/07/13 面试题
2015民办小学年度工作总结
2015/05/26 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书
国情备忘录观后感
2015/06/04 职场文书
人事任命书范本
2015/09/21 职场文书
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL