用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里隐藏的“禅”
Jun 16 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
使用Python在Windows下获取USB PID&VID的方法
Jul 02 Python
面向对象学习之pygame坦克大战
Sep 11 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
Django+Django-Celery+Celery的整合实战
Jan 20 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Apr 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的hash算法介绍
2014/02/13 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
PHP网络操作函数汇总
2015/05/18 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
微信小程序的mpvue框架快速上手指南
2019/05/15 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
机器学习10大经典算法详解
2017/12/07 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Python页面加载的等待方式总结
2021/02/28 Python
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
幼儿园语言教学反思
2016/02/23 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书