用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 字符串中的字符倒转
Sep 06 Python
Python判断文件和文件夹是否存在的方法
May 21 Python
Python标准库之collections包的使用教程
Apr 27 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
Python设计模式之代理模式实例详解
Jan 19 Python
Python从函数参数类型引出元组实例分析
May 28 Python
python 异步async库的使用说明
May 04 Python
python如何查看网页代码
Jun 07 Python
Python Opencv图像处理基本操作代码详解
Aug 31 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 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导出oracle库的php代码
2009/04/20 PHP
php中rename函数用法分析
2014/11/15 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
URL中“#” “?” &“”号的作用浅析
2017/02/04 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
python发送邮件实例分享
2017/07/28 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
python 魔法函数实例及解析
2019/09/25 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
精细化工应届生求职信
2013/11/17 职场文书
低碳环保倡议书
2014/04/14 职场文书
小学一年级评语大全
2014/04/22 职场文书
六年级学生评语
2014/04/22 职场文书
教师节宣传方案
2014/05/23 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
培训感想范文
2015/08/07 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS