用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远程登录代码
Apr 29 Python
Python的mysql数据库的更新如何实现
Jul 31 Python
python/sympy求解矩阵方程的方法
Nov 08 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
Python插件机制实现详解
May 04 Python
pycharm 2020 1.1的安装流程
Sep 29 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 Python
详解pandas映射与数据转换
Jan 22 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中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
php通过session防url攻击方法
2014/12/10 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
Python松散正则表达式用法分析
2016/04/29 Python
深入理解Python3 内置函数大全
2017/11/23 Python
python3爬取数据至mysql的方法
2018/06/26 Python
pandas的qcut()方法详解
2019/07/06 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
大专生自我鉴定范文
2013/10/01 职场文书
写给父母的感谢信
2015/01/22 职场文书
钢琴师观后感
2015/06/12 职场文书
运动会100米加油稿
2015/07/21 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server