在数据库中,我们可以对数据进行分类,聚合运算。例如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. redis学习笔记——入门

    基本安装和用法:http://www.tuicool.com/articles/QzMRNb Redis如何通过本机客户端访问远程服务器段:http://blog.sina.com.cn/s/blog ...

  2. 倍福TwinCAT(贝福Beckhoff)基础教程6.1 TwinCAT如何与高级语言通讯

    因为使用TwinCAT的人用途不同,重视点就不同.如果用来代替传统PLC+HMI做项目的,很少会需要用到跟高级语言通讯,但是如果是用来做运动控制平台如做机器人运动控制器的,就肯定会用到.不管是否用得上 ...

  3. ionic准备之angular基础——$watch,$apply,$timeout方法(5)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 【OpenGL 学习笔记01】HelloWorld演示样例

    <<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比較踏实,哈哈. 我的主题是,好记性不如烂笔头. ========== ...

  5. JavaScript 闭包 面试题

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  6. Velocity.js动画库使用

    1.简介 Velocity 是一个简单易用.高性能.功能丰富的轻量级JS动画库.它能和 jQuery 完美协作,并和$.animate()有相同的 API, 但它不依赖 jQuery,可单独使用. 2 ...

  7. 【BIEE】09_BIEE控制台乱码问题解决

    BIEE安装完成后,点击[启动BI服务] 接着从弹出窗口可以发现,全部汉字都是乱码 出现这种情况,想看一下BIEE启动情况是很费劲的,接着我们处理一下这个问题 1.从路径D:\obiee\user_p ...

  8. VM里面的桥接

      今天我们谈一谈桥接模式,一般的时候,我用的是NAT模式,需要设置另一个虚拟网卡的IP地址,而不是借助本机的物理网卡.   编辑---虚拟网络编辑器 有些时候直接设置桥接到某个网卡可能会不成功,我们 ...

  9. MySQL自增长主键探究

    MySQL自己主动增长使用的keyword是 AUTO_INCREMENT; 由于属于 DDL.所以不区分大写和小写. 使用的列,必须被定义为 key, 比方主键,唯一键等. 本文中使用的数据库是 M ...

  10. BZOJ 1012 线段树||单调队列

    非常裸的线段树  || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...