用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库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
python通过百度地图API获取某地址的经纬度详解
Jan 28 Python
Python内置函数reversed()用法分析
Mar 20 Python
Python从函数参数类型引出元组实例分析
May 28 Python
python issubclass 和 isinstance函数
Jul 25 Python
python编写微信公众号首图思路详解
Dec 13 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
Jul 14 Python
通过代码实例了解Python异常本质
Sep 16 Python
UI自动化定位常用实现方法代码示例
Oct 27 Python
python 读取串口数据的示例
Nov 09 Python
深入探讨opencv图像矫正算法实战
May 21 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中的Class的几点个人看法
2006/10/09 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
非常漂亮的JS代码经典广告
2007/10/21 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
python实现抖音点赞功能
2019/04/07 Python
python打包成so文件过程解析
2019/09/28 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
记者岗位职责
2014/01/06 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
2014年药房工作总结
2014/11/22 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
陪护人员误工证明
2015/06/24 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python
5个实用的JavaScript新特性
2022/06/16 Javascript