Python Pandas分组聚合的实现方法


Posted in Python onJuly 02, 2019

Pycharm 鼠标移动到函数上,CTRL+Q可以快速查看文档,CTR+P可以看基本的参数。

apply(),applymap()和map()

apply()和applymap()是DataFrame的函数,map()是Series的函数。

apply()的操作对象是DataFrame的一行或者一列数据,applymap()是DataFrame的每一个元素。map()也是Series中的每一个元素。

apply()对dataframe的内容进行批量处理, 这样要比循环来得快。如df.apply(func,axis=0,.....) func:定义的函数,axis=0时为对列操作,=1时为对行操作。

map()和python内建的没啥区别,如df['one'].map(sqrt)。

import numpy as np

from pandas import Series, DataFrame

 

frame = DataFrame(np.random.randn(4, 3),

         columns = list('bde'),

         index = ['Utah', 'Ohio', 'Texas', 'Oregon'])

print frame

print np.abs(frame)

print

 

f = lambda x: x.max() - x.min()

print frame.apply(f)

print frame.apply(f, axis = 1)

def f(x):

  return Series([x.min(), x.max()], index = ['min', 'max'])

print frame.apply(f)

print

 

print 'applymap和map'

_format = lambda x: '%.2f' % x

print frame.applymap(_format)

print frame['e'].map(_format)

Groupby

Groupby是Pandas中最为常用和有效的分组函数,有sum()、count()、mean()等统计函数。

groupby 方法返回的 DataFrameGroupBy 对象实际并不包含数据内容,它记录的是df['key1'] 的中间数据。当你对分组数据应用函数或其他聚合运算时,pandas 再依据 groupby 对象内记录的信息对 df 进行快速分块运算,并返回结果。

df = DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],

        'key2': ['one', 'two', 'one', 'two', 'one'],

        'data1': np.random.randn(5),

        'data2': np.random.randn(5)})

grouped = df.groupby(df['key1'])

print grouped.mean() 



df.groupby(lambda x:'even' if x%2==0 else 'odd').mean() #通过函数分组

聚合agg()

对于分组的某一列(行)或者多个列(行,axis=0/1),应用agg(func)可以对分组后的数据应用func函数。例如:用grouped['data1'].agg('mean')也是对分组后的'data1'列求均值。当然也可以同时作用于多个列(行)和使用多个函数上。

df = DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],

        'key2': ['one', 'two', 'one', 'two', 'one'],

        'data1': np.random.randn(5),

        'data2': np.random.randn(5)})

grouped = df.groupby('key1')

print grouped.agg('mean')

 

     data1   data2

key1          

a   0.749117 0.220249

b  -0.567971 -0.126922

apply()和agg()功能上差不多,apply()常用来处理不同分组的缺失数据的填充和top N的计算,会产生层级索引。

而agg可以同时传入多个函数,作用于不同的列。

df = DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],

        'key2': ['one', 'two', 'one', 'two', 'one'],

        'data1': np.random.randn(5),

        'data2': np.random.randn(5)})

grouped = df.groupby('key1')

print grouped.agg(['sum','mean'])
print grouped.apply(np.sum)  #apply的在这里同样适用,只是不能传入多个,这两个函数基本是可以通用的。

         data1               data2         
           sum      mean       sum      mean
key1                                       
a     2.780273  0.926758 -1.561696 -0.520565
b    -0.308320 -0.154160 -1.382162 -0.691081

         data1     data2 key1       key2
key1                                   
a     2.780273 -1.561696  aaa  onetwoone
b    -0.308320 -1.382162   bb     onetwo

apply和agg功能上基本是相近的,但是多个函数的时候还是agg比较方便。

apply本身的自由度很高,如果分组之后不做聚合操作紧紧是一些观察的时候,apply就有用武之地了。

print grouped.apply(lambda x: x.describe())

 

        data1   data2

key1             

a  count 3.000000 3.000000

   mean -0.887893 -1.042878

   std  0.777515 1.551220

   min  -1.429440 -2.277311

   25%  -1.333350 -1.913495

   50%  -1.237260 -1.549679

   75%  -0.617119 -0.425661

   max  0.003021 0.698357

b  count 2.000000 2.000000

   mean -0.078983 0.106752

   std  0.723929 0.064191

   min  -0.590879 0.061362

   25%  -0.334931 0.084057

   50%  -0.078983 0.106752

   75%  0.176964 0.129447

   max  0.432912 0.152142

此外apply还能改变返回数据的维度。

http://pandas.pydata.org/pandas-docs/stable/groupby.html

此外还有透视表pivot_table ,交叉表crosstab ,但是我没用过。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python对象的深拷贝和浅拷贝详解
Aug 25 Python
在Python中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
Jan 08 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
PyQt 图解Qt Designer工具的使用方法
Aug 06 Python
python使用matplotlib绘制雷达图
Oct 18 Python
如何在python中写hive脚本
Nov 08 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
python 按钮点击关闭窗口的实现
Mar 04 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
Apr 07 Python
numpy数据类型dtype转换实现
Apr 24 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 #Python
python flask框架实现重定向功能示例
Jul 02 #Python
python实现串口自动触发工作的示例
Jul 02 #Python
python常用函数与用法示例
Jul 02 #Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 #Python
python for和else语句趣谈
Jul 02 #Python
python交互模式下输入换行/输入多行命令的方法
Jul 02 #Python
You might like
yii操作session实例简介
2014/07/31 PHP
浅谈php7的重大新特性
2015/10/23 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
php微信开发之图片回复功能
2018/06/14 PHP
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
javascript 函数的暂停和恢复实例详解
2020/04/25 Javascript
Python下载指定页面上图片的方法
2016/05/12 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Python和Go语言的区别总结
2019/02/20 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
Python常用库大全及简要说明
2020/01/17 Python
python代码中怎么换行
2020/06/17 Python
Python reques接口测试框架实现代码
2020/07/28 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
教师年度考核自我评鉴
2015/08/11 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书