用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中使用poplib模块收取邮件的教程
Apr 29 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
异步任务队列Celery在Django中的使用方法
Jun 07 Python
Python双向循环链表实现方法分析
Jul 30 Python
python正则表达式去除两个特殊字符间的内容方法
Dec 24 Python
Python设计模式之外观模式实例详解
Jan 17 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
python的re模块使用方法详解
Jul 26 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
Pytorch 实现变量类型转换
May 17 Python
如何利用Python实现一个论文降重工具
Jul 09 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 高手之路(一)
2006/10/09 PHP
php 各种应用乱码问题的解决方法
2010/05/09 PHP
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
jQuery的基本概念与高级编程
2015/05/14 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
python Django连接MySQL数据库做增删改查
2013/11/07 Python
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
新加坡交友网站:be2新加坡
2019/04/10 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
新书发布会策划方案
2014/06/09 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
婚前协议书范本两则
2014/10/16 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
HTML基础详解(下)
2021/10/16 HTML / CSS
MySQL优化之慢日志查询
2022/06/10 MySQL
python缺失值填充方法示例代码
2022/12/24 Python