在数据库中,我们可以对数据进行分类,聚合运算。例如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数据分析之:数据聚合与分组运算的更多相关文章

  1. 利用python进行数据分析之数据聚合和分组运算

    对数据集进行分组并对各分组应用函数是数据分析中的重要环节. group by技术 pandas对象中的数据会根据你所提供的一个或多个键被拆分为多组,拆分操作是在对象的特定轴上执行的,然后将一个函数应用 ...

  2. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

  3. Python 数据分析—第九章 数据聚合与分组运算

    打算从后往前来做笔记 第九章 数据聚合与分组运算 分组 #生成数据,五行四列 df = pd.DataFrame({'key1':['a','a','b','b','a'], 'key2':['one ...

  4. 《python for data analysis》第九章,数据聚合与分组运算

    # -*- coding:utf-8 -*-# <python for data analysis>第九章# 数据聚合与分组运算import pandas as pdimport nump ...

  5. Python数据聚合和分组运算(1)-GroupBy Mechanics

    前言 Python的pandas包提供的数据聚合与分组运算功能很强大,也很灵活.<Python for Data Analysis>这本书第9章详细的介绍了这方面的用法,但是有些细节不常用 ...

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

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

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

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

  8. 利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)

    对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节.在将数据集加载.融合.准备好之后,通常是计算分组统计或生成透视表.pandas提供了一个灵活高效的group ...

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

    分组键可以有多种方式,且类型不必相同 列表或数组, 某长度与待分组的轴一样 表示DataFrame某个列名的值 字典或Series,给出待分组轴上的值与分组名之间的对应关系 函数用于处理轴索引或索引中 ...

随机推荐

  1. Node.js 使用angularjs取得Nodejs http服务端返回的JSON数组示例

    server.js代码: // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http" ...

  2. Angular 学习笔记——$interpolateProvide

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  3. 迭代器适配器(一)back_inserter和front_inserter的实现

    本文讨论back_inserter和front_inserter的实现. 当我们调用copy函数的时候,要确保目标容器具有足够大的空间,例如: //将other的所有元素拷贝到以coll.begin( ...

  4. 已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”

    题目:已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”. 代码: <!DOCTYPE html> &l ...

  5. 【VAB】获取库文件地址

    如何获取Excle库文件地址呢?具体代码如下: Public Sub 获取Excel库文件夹的路径() MsgBox "库文件夹的路径是: " & Application. ...

  6. DICOM医学图像处理:WEB PACS初谈二,图像的传输

    背景: 如前一篇专栏博文所述,借助于CGI或FastCGI技术转发浏览器发送过来的用户请求,启动本地的DCMTK和CxImage库响应.然后将处理结果转换成常规图像返回到浏览器来实现Web PACS. ...

  7. iOS项目开发之仿网易彩票推荐应用

    简介 效果展示 思路分析 代码实现 Git地址 一.简介 某些公司有较多的产品时,通常会在一个产品中推广另外的一些产品,我简单的封装了一个UIControllerView,由于不同公司,要求不同.所以 ...

  8. 【SpringMVC学习03】SpringMVC中注解和非注解方式下的映射器和适配器总结

    从上一篇的springmvc入门中已经看到,springmvc.xml中的配置了映射器和适配器,是使用非注解的方式来配置的,这是非注解方式的一种,这里再复习一下: 1. 非注解方式 1.1 处理器适配 ...

  9. atititi.soa  微服务 区别 联系 优缺点.doc

    atititi.soa  微服务 区别 联系 优缺点.doc 1. 应用微服务的动机,跟传统巨石应用的比较1 2. 面向服务架构(SOA)  esb2 3. 微服务架构(Microservices)2 ...

  10. Atitit swt 4.3 4.4 4.5 新特性java attilax总结

    Atitit swt 4.3 4.4 4.5 新特性java attilax总结 1. 4.5 Release - June 3, 20151 1.1. Older Releases1 2. SWT  ...