前言

Python的pandas包提供的数据聚合与分组运算功能很强大,也很灵活。《Python for Data Analysis》这本书第9章详细的介绍了这方面的用法,但是有些细节不常用就容易忘记,遂打算把书中这部分内容总结在博客里,以便复习查看。根据书中的章节,这部分知识包括以下四部分:

1.GroupBy Mechanics(groupby技术)

2.Data Aggregation(数据聚合)

3.Group-wise Operation and Transformation(分组级运算和转换)

4.Pivot Tables and Cross-Tabulation(透视表和交叉表)

本文是第一部分,介绍groupby技术。

一、分组原理

核心:

1.不论分组键是数组、列表、字典、Series、函数,只要其与待分组变量的轴长度一致都可以传入groupby进行分组。

2.默认axis=0按行分组,可指定axis=1对列分组。

对数据进行分组操作的过程可以概括为:split-apply-combine三步:

1.按照键值(key)或者分组变量将数据分组。

2.对于每组应用我们的函数,这一步非常灵活,可以是python自带函数,可以是我们自己编写的函数。

3.将函数计算后的结果聚合。

图1:分组聚合原理(图片来自《Python for Data Analysis》page 252)

import pandas as pd
import numpy as npdf = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],'key2' : ['one', 'two', 'one', 'two', 'one'],'data1' : np.random.randn(5),'data2' : np.random.randn(5)})

我们将key1当做我们的分组键值,对data1进行分组,再求每组的均值:

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

语法很简单,但是这里需要注意grouped的数据类型,它不在是一个数据框,而是一个GroupBy对象。

grouped

实际上,在这一步,我们并没有进行任何计算仅仅是创建用key1分组后创建了一个GroupBy对象,我们后面函数的任何操作都是基于这个对象的。

求均值:

grouped.mean()

刚刚我们只是用了key1进行了分组,我们也可以使用两个分组变量,并且通过unstack方法进行结果重塑:

means = df['data1'].groupby([df['key1'], df['key2']]).mean()
means

means.unstack

以上我们的分组变量都是df内部的Series,实际上只要是和key1等长的数组也可以:

states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
years = np.array([2005, 2005, 2006, 2005, 2006])
df['data1'].groupby([states, years]).mean()

二、对分组进行迭代

GroupBy对象支持迭代操作,会产生一个由分组变量名和数据块组成的二元元组:

for name, group in df.groupby('key1'):print nameprint group

如果分组变量有两个:

for (k1,k2), group in df.groupby(['key1','key2']):print k1,k2print group

我们可以将上面的结果转化为list或者dict,来看看结果是什么样的:

list(df.groupby(['key1','key2']))

看不太清楚,我们来看看这个列表的第一个元素:

list(df.groupby(['key1','key2']))[0]

同样,我们也可以将结果转化为dict(字典):

dict(list(df.groupby(['key1','key2'])))

dict(list(df.groupby(['key1','key2'])))[('a','one')]

以上都是基于行进行分组,因为默认情况下groupby是在axis=0方向(行方向)进行分组,我们可以指定axis=1方向(列方向)进行分组:

grouped=df.groupby(df.dtypes,axis=1)
list(grouped)[0]

dict(list(grouped))

注意,

'''下面两段语句功能一样'''
df.groupby('key1')['data1']
df.data1.groupby(df.key1)

三、通过字典进行分组

people = pd.DataFrame(np.random.randn(5, 5),columns=['a', 'b', 'c', 'd', 'e'],index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
people.ix[2:3, ['b', 'c']] = np.nan # 添加缺失值
people

假如,我们想按列进行聚合,该怎么操作呢?

我们根据实际情况,对列名建立字典,然后将此字典传入groupby,切记指定axis=1,因为我们是对列进行分组聚合:

mapping = {'a': 'red', 'b': 'red', 'c': 'blue','d': 'blue', 'e': 'red', 'f' : 'orange'}
by_columns=people.groupby(mapping,axis=1)
by_columns.mean()

既然我们可以通过传入字典来对列进行分组,那么肯定也可以通过传入Series来对列进行分组了(Series中的index就相当字典中的key嘛):

map_series = pd.Series(mapping)
people.groupby(map_series,axis=1).count()

四、通过函数进行分组

刚刚我们分组时利用了dict和series建立映射,对于一些复杂的需求,我们可以直接对groupby函数传递函数名来进行分组,以刚才的people数据为例,如果我们想按行分组,分组的key是每个人名的字母长度,该怎么做呢?比较直接的想法是相对每个名字求长度,建立一个数组,然后将这个数组传入groupby,我们来试验一下:

l=[len(x) for x in people.index]
people.groupby(l).count()

方案可行,那么有没有更快捷更优美的方法呢?当然有啦,我们只需将len这个函数名传给groupby即可:

people.groupby(len).count()

除了传递函数,我们也可以将函数和dict,series,array一起使用,毕竟最后都会统统转化为数组:

key_list = ['one', 'one', 'one', 'two', 'two']
people.groupby([len, key_list]).min()

五、根据索引级别分组

刚刚我们的数据索引只有一级,当数据有多级索引时,可以通过level指定我们想要分组的索引,注意要使用axis=1表示按列:

columns = pd.MultiIndex.from_arrays([['Asian', 'Asian', 'Asian', 'America', 'America'],['China','Japan','Singapore','United States','Canada']], names=['continent', 'country'])
hier_df = pd.DataFrame(np.random.randn(4, 5), columns=columns)
hier_df

我们按洲进行分组求和:

转载于:https://www.cnblogs.com/zhangzhangwhu/p/7219651.html

Python数据聚合和分组运算(1)-GroupBy Mechanics相关推荐

  1. 【学习经典】python 数据聚合与分组运算(part 2)

    本文的前半部分:python 数据聚合与分组运算(part 1) 4. 透视表和交叉表 透视表(pivot table)是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具.它根据一个或多个键 ...

  2. 【学习】数据聚合和分组运算【groupby】

    [学习]数据聚合和分组运算[groupby] 分组键可以有多种方式,且类型不必相同 列表或数组, 某长度与待分组的轴一样 表示DataFrame某个列名的值 字典或Series,给出待分组轴上的值与分 ...

  3. 【Python】GroupBy:数据聚合与分组运算

    [博客地址]:https://blog.csdn.net/sunyaowu315 [博客大纲地址]:https://blog.csdn.net/sunyaowu315/article/details/ ...

  4. Python之数据聚合与分组运算

    Python之数据聚合与分组运算 1. 关系型数据库方便对数据进行连接.过滤.转换和聚合. 2. Hadley Wickham创建了用于表示分组运算术语"split-apply-combin ...

  5. 类的应用python平均分_【数据科学系统学习】Python # 数据分析基本操作[四] 数据规整化和数据聚合与分组运算...

    本篇内容为整理<利用Python进行数据分析>,博主使用代码为 Python3,部分内容和书本有出入. 在前几篇中我们介绍了 NumPy.pandas.matplotlib 三个库的基本操 ...

  6. pandas合并groupby_pandas数据聚合与分组运算——groupby方法

    简介 pandas中一类非常重要的操作是数据聚合与分组运算.通过groupby方法能够实现对数据集的拆分.统计.转换等操作,这个过程一气呵成. 在本文中,你将学到: 选取特定列分组: 对分组进行迭代: ...

  7. python 数据聚合与分组

    python 数据聚合与分组 前面讲完了字符处理,但对数据进行整体性的聚合运算以及分组操作也是数据分析的重要内容. 通过数据的聚合与分组,我们能更容易的发现隐藏在数据中的规律. 数据分组 数据的分组核 ...

  8. vfp python_python foxpro数据聚合和分组运算——分组级运算和转换(3)

    数据聚合和分组运算--分组级运算和转换(3),有需要的朋友可以参考下. 1.假设我们想要为一个DataFrame添加一个用于存放各索引分组平均值的列,一个办法是先聚合再合并: >>> ...

  9. 《利用python进行数据分析》读书笔记--第九章 数据聚合与分组运算(一)

    http://www.cnblogs.com/batteryhp/p/5046450.html 对数据进行分组并对各组应用一个函数,是数据分析的重要环节.数据准备好之后,通常的任务就是计算分组统计或生 ...

最新文章

  1. 如何使用Jenkins持续集成C#网站项目
  2. Oracle通过SSL方式连接AD服务器
  3. HTML5标签用法及描述
  4. 用过C#的朋友可能认为它是一种十分安全的语言,其实C#也可以做到经典的缓冲区溢出。 本文章将用一个实例来描述C#究竟是如何发生缓冲区溢出的! 首先建立一个C# Console工程,并开启工程的“允许
  5. LeetCode 934. 最短的桥(2次BFS)
  6. 51单片机基本刷屏测试实验_51单片机开发基础8——实时时钟实验
  7. jquery将表单序列化json对象
  8. powerdesigner显示工具面板_photoshop教程-画笔工具预设与选项设置
  9. linux怎么重装ssh服务器,Linux平台下安装SSH
  10. python中构造函数可以重载吗_python中的函数重载了吗?
  11. 史上最全最简洁的网络传输协议介绍
  12. 深度学习与计算机视觉教程(2) | 图像分类与机器学习基础(CV通关指南·完结)
  13. 1030:计算球的体积
  14. java面试时怎么做自我介绍_面试时如何做好自我介绍
  15. GitHub---团队合作
  16. C++项目和解决方案的区别
  17. 解决 k8s flannel网络 一直 Init:ImagePullBackOff和coredns状态为Pending
  18. 录制动画时AnimationClip.SetCurve的relativePath问题
  19. AODV协议的运行方式
  20. Scratch软件编程等级考试一级——201909

热门文章

  1. 网络共享计算机权限访问,共享电脑没有访问权限_共享电脑无访问权限
  2. msra数据集_ECCV 2020 | 通过聚类无标签数据来提高人脸识别能力
  3. 管理学书籍推荐:这10本优秀的管理类书籍最值得一读
  4. 电脑生成siri语音_给电脑里装个Siri!海尔智能语音系统体验
  5. 基于Ad hoc的多跳通信
  6. 四川子苗电商:抖音直播安心购怎么解约?
  7. 如何正确使用步道乐跑
  8. spring-clou限流详解
  9. BZOJ 3036 绿豆蛙的归宿
  10. 小明加密通道进入_德州人行通道闸哪个牌子好