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 相关文章推荐
使用IPython来操作Docker容器的入门指引
Apr 08 Python
Python脚本在Appium库上对移动应用实现自动化测试
Apr 17 Python
python类装饰器用法实例
Jun 04 Python
Python中的模块导入和读取键盘输入的方法
Oct 16 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
Python常见数据结构之栈与队列用法示例
Jan 14 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
PyQt5 界面显示无响应的实现
Mar 26 Python
python 制作简单的音乐播放器
Nov 25 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
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
网站用php实现paypal整合方法
2010/11/28 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
Node.js简单入门前传
2017/08/21 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python字符编码判断方法分析
2016/07/01 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
python语言元素知识点详解
2019/05/15 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
keras 多任务多loss实例
2020/06/22 Python
简单的Python人脸识别系统
2020/07/14 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
2014年关于两会精神的心得体会
2014/03/17 职场文书
心理健康活动总结
2014/04/30 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
小学综合实践活动总结
2014/07/07 职场文书
员工年度工作总结2015
2015/05/18 职场文书
《月光曲》教学反思
2016/02/16 职场文书