python数据分析之:数据聚合与分组运算
在数据库中,我们可以对数据进行分类,聚合运算。例如groupby操作。在pandas中同样也有类似的功能。通过这些聚合,分组操作,我们可以很容易的对数据进行转换,清洗,运算。比如如下图,首先通过不同的键值进行分类,然后对各个分类进行求和运算。

我们来看实际的例子,首先生成一组数据如下
df=DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})
data1 data2 key1 key2
0 0.426519 0.321085 a one
1 0.918215 0.418922 a two
2 -2.792968 0.629589 b one
3 -0.431760 0.231652 b two
4 0.570083 -0.799304 a one
然后针对data1列根据key1的值来进行分组
groupd=df['data1'].groupby(df['key1'])
得到groupd只是一个聚合的对象,我们可以在这个对象上进行各种运算。比如groupd.mean(), groupd.sum()分别代表平均数,求和。结果如下,生成了一个新的数据列,且列名还是key1
key1
a 0.146577
b -0.947097
Name: data1, dtype: float64
key1
a 0.439730
b -1.894193
Name: data1, dtype: float64
在groupby中还可以传递多个数组,比如
groupd1=df['data1'].groupby([df['key1'],df['key2']]).sum()
结果如下:通过key1列进行聚合后,在通过key2列对之前的数据再聚合. 然后求和。
key1 key2
a one -0.115901
two -0.030998
b one -0.039265
two 0.295743
Name: data1, dtype: float64
当然还可以将列名也用作分组键。
df.groupby(df['key1']).mean()
data1 data2
key1
a 0.381235 0.453622
b -0.179429 -0.880869
df.groupby([df['key1'],df['key2']]).mean()
data1 data2
key1 key2
a one 0.466122 0.328501
two 0.211462 0.703865
b one 0.848630 -0.598706
two -1.207488 -1.163033
通过上面的结果可以看到通过key1进行分组的时候key2列是不存在的,这是因为key2列不是整数数据。所以从结果中排除了。
对元组进行迭代
前面通过df.groupby(df[‘key1’])进行分组的时候,我们其实得到了两类分组,一种是a的分组,一种是b的分组。因为在key1列中只有这2个值,如果我们想分别访问这两组分组的数据,就需要用到迭代了。
for group1,group2 in df.groupby(df['key1']):
print group1,group2
这样就分别得到了针对a,b的各自分组。
a data1 data2 key1 key2
0 -0.973337 0.656690 a one
1 0.930285 -2.361232 a two
4 -0.195729 -0.717847 a one
b data1 data2 key1 key2
2 -0.167785 -0.907817 b one
3 -2.245887 -0.170275 b two
对于多列的分组:
for group1,group2 in df.groupby([df['key1'],df['key2']]):
print group1
print group2
结果如下,总共有4个分组。分别是(‘a’,’one’),(‘a’,’two’),(‘b’,’one’),(‘b’,’two’)
('a', 'one')
data1 data2 key1 key2
0 -0.430579 -0.810844 a one
4 0.481271 -0.998662 a one
('a', 'two')
data1 data2 key1 key2
1 -0.114657 1.062592 a two
('b', 'one')
data1 data2 key1 key2
2 -0.996202 0.661732 b one
('b', 'two')
data1 data2 key1 key2
3 0.812372 -1.09057 b two
下面总结一下groupby的聚合运算的方法:

apply:
apply会将待处理的对象拆分成多个片段。然后将各片段调用传入的函数,最后尝试将各段组合在一起。来看下面的这个例子:
def get_stats(group):
return {'min':group.min(),'max':group.max(),'count':group.count(),'mean':group.mean()}
def group_by_test():
frame=DataFrame({'data1':np.random.randn(100),'data2':np.random.randn(100)})
factor=pd.cut(frame.data1,4)
print factor
print frame.data2.groupby(factor).apply(get_stats)
首先在group_by_test中,通过pd.cut将frame进行4分位分隔。然后对各个分位进行聚合。最后通过apply函数对各个分组调用get_stats函数。这个函数的作用和下面的代码的作用是一样的。
for g in frame.data2.groupbyby(facotr):
get_stats(g)
随机采样和排列:
假设想要从一个大数据集中随机抽样样本进行分析工作。np.random.permutation(N)选取前k个元素, 其中N为完整数据的大小,K为期望的样本大小。下面举一个扑克牌的例子
def draw(deck,n=5):
return deck.take(np.random.permutation(len(deck))[:n])
def group_by_test2():
card_val=(range(1,11)+[10]*3)*4 #牌的序号
base_name=['A']+range(2,11)+['J','K','Q'] #牌名
cards=[]
suits=['H','S','C','D'] #花色:红桃(Hearts),黑桃(Spades),梅花(Clubs),方片(Diamonds)
for suit in ['H','S','C','D']:
cards.extend(str(num)+suit for num in base_name) #产生牌
deck=Series(card_val,index=cards)
get_suit=lambda card:card[-1] #根据牌名最后一个字符也就是花色进行分组。
print deck.groupby(get_suit).apply(draw,n=2)
运行结果:
C 8C 8
9C 9
D KD 10
QD 10
H 5H 5
9H 9
S 7S 7
JS 10
dtype: int64
python数据分析之:数据聚合与分组运算的更多相关文章
- 利用python进行数据分析之数据聚合和分组运算
对数据集进行分组并对各分组应用函数是数据分析中的重要环节. group by技术 pandas对象中的数据会根据你所提供的一个或多个键被拆分为多组,拆分操作是在对象的特定轴上执行的,然后将一个函数应用 ...
- Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识
Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...
- Python 数据分析—第九章 数据聚合与分组运算
打算从后往前来做笔记 第九章 数据聚合与分组运算 分组 #生成数据,五行四列 df = pd.DataFrame({'key1':['a','a','b','b','a'], 'key2':['one ...
- 《python for data analysis》第九章,数据聚合与分组运算
# -*- coding:utf-8 -*-# <python for data analysis>第九章# 数据聚合与分组运算import pandas as pdimport nump ...
- Python数据聚合和分组运算(1)-GroupBy Mechanics
前言 Python的pandas包提供的数据聚合与分组运算功能很强大,也很灵活.<Python for Data Analysis>这本书第9章详细的介绍了这方面的用法,但是有些细节不常用 ...
- Python之数据聚合与分组运算
Python之数据聚合与分组运算 1. 关系型数据库方便对数据进行连接.过滤.转换和聚合. 2. Hadley Wickham创建了用于表示分组运算术语"split-apply-combin ...
- 《利用python进行数据分析》读书笔记--第九章 数据聚合与分组运算(一)
http://www.cnblogs.com/batteryhp/p/5046450.html 对数据进行分组并对各组应用一个函数,是数据分析的重要环节.数据准备好之后,通常的任务就是计算分组统计或生 ...
- 利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)
对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节.在将数据集加载.融合.准备好之后,通常是计算分组统计或生成透视表.pandas提供了一个灵活高效的group ...
- 【学习】数据聚合和分组运算【groupby】
分组键可以有多种方式,且类型不必相同 列表或数组, 某长度与待分组的轴一样 表示DataFrame某个列名的值 字典或Series,给出待分组轴上的值与分组名之间的对应关系 函数用于处理轴索引或索引中 ...
随机推荐
- 简易高重用的jdbcutils工具封装实现类以及简易连接池实现
因为如今发现做个小项目都是导入n多的依赖包,非常烦琐,仅仅想快点开发完一个个的小需求项目,这个时候真心不想用框架,仅仅能自己写个jdbcutils,尽管网上有非常多有apache的,阿里的,可是感觉用 ...
- quick-cocos2d-x transition使用方法
Functions transition.newEasing(action, easingName, more) 为图像创造效果 transition.execute(target, action, ...
- Asp.net管道模型(管线模型)之一发不可收拾
前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预想的大了很多. 有本篇作基础,下面两篇就 ...
- ROS当中添加第三方库
下文以serial 库为依据讲解第三方库在ROS下面的配置. 参考文献:http://blog.csdn.net/u011853479/article/details/51263590 ros中使 ...
- (一)Thymeleaf用法——Thymeleaf简介
1. thymeleaf认识 参考官方文档(Project version: 3.0.5.RELEASE) 1.1 介绍 Thymeleaf是面向Web和独立环境的现代服务器端Java模板引擎,能 ...
- java模拟异步消息的发送与回调
http://kt8668.iteye.com/blog/205739 本文的目的并不是介绍使用的什么技术,而是重点阐述其实现原理. 一. 异步和同步 讲通俗点,异步就是不需要等当前执行的动作完成 ...
- xcode 项目证书跟签名都正确的时候,还报证书错误
原因,安装证书错误,导致无法匹配证书, 方案:删除原来的证书,重新安装 打开终端 1.cd Library/ 2.cd MobileDevice/ 3.open Provisioning\ Profi ...
- vim 批处理
一.使用args , argdo 进行文件批处理 1. :args ./src/**/*.js 利用args命令标记所要处理的文件 2. :argdo %s/tabindex/tabI ...
- docker 报错 Error response from daemon: driver failed programming external connectivity on endpoint mynginx
Error response from daemon: driver failed programming external connectivity on endpoint mynginx (7d1 ...
- 使用 yarn 作为 Npm 的代替方案
相关传送门: # window 安装包下载https://yarnpkg.com/zh-Hans/docs/install#windows-stable # yarn官方网站 https://yarn ...