热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python随机分组的思路_python数据聚合与分组

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

前面讲完了字符处理,但对数据进行整体性的聚合运算以及分组操作也是数据分析的重要内容。

通过数据的聚合与分组,我们能更容易的发现隐藏在数据中的规律。

数据分组

数据的分组核心思想是:拆分-组织-合并

首先,我们了解下groupby这个函数

import numpy as np

import pandas as pd

data=pd.DataFrame({'level':['a','b','c','b','a'],

'num':[3,5,6,8,9]})

print(data)

结果为:

981211-20161004134642926-2080164531.png

combine=data['num'].groupby(data['level'])

print(combine.mean())

结果为:

981211-20161004134527395-111034270.png

这里是以level为关键字对num进行分组,然后求平均值。当然groupby中也可以放入多个分组,用逗号隔开

print(combine.size())

结果为:

981211-20161004135219770-12139612.png

返回每个分组的频率

另外,我们也可以根据数据的所属类型对进行分组

combine=data.groupby(data.dtypes,axis=1)

print(dict(list(combine)))

结果为:

981211-20161004140225067-1189017771.png

这里combine的是Serise数据结构,需要转换线转换为列表,再转成字典的形式才能打印。

data=pd.DataFrame(np.random.randn(5,5),

index=['li','chen','wang','zhao','qian'],

columns=['a','b','c','d','e'])

print(data)

结果为:

981211-20161004142303754-450889966.png

data.ix[1:3,['b','c']]=np.nan

map={'a':'ss','b':'kk','c':'ss','d':'kk','e':'kk'}

print(data.groupby(map,axis=1).sum())

结果为:

981211-20161004142334223-1138039871.png

这里map是我们手工创造的字典,然后我们根据字典的对应表对data数据的行进行分组求和。

数据聚合

在各计算机语言中,聚合函数几乎都差不多,下面我们来看下python中的聚合函数

981211-20161004143414145-1349855185.png

当然,我们也可以通过自定义函数来扩展方法。

跟上面直接在数据后面加聚合函数方法略有不同,聚合函数这里也可以传入agg或aggregate中

data=pd.DataFrame({'level':['a','b','c','b','a'],

'num':[3,5,6,8,9]})

newdata=data.groupby('level')

print(newdata.agg('mean'))

结果为:

981211-20161004144546067-65994565.png

print(newdata.agg(['mean','sum','std']))

也可以多个聚合函数一起使用:

981211-20161004144736332-363723457.png

还能用字典的形式进行聚合运算

data=pd.DataFrame({'level':['a','b','c','b','a'],

'num':[3,5,6,8,9],

'num1':[2,5,9,6,8]})

newdata=data.groupby('level')

print(newdata.agg({'num':'mean','num1':'sum'}))

结果为:

981211-20161004145456223-1813158332.png

接下来我们了解下transform

data=pd.DataFrame(np.random.randn(5,5),

index=['li','chen','wang','zhao','qian'],

columns=['a','b','c','d','e'])

key=['ss','kk','kk','ss','ss']

print(data.groupby(key).mean())

结果为

981211-20161004161247598-1359755500.png

正常求均值之后,会独立形成一个dataframe

print(data.groupby(key).transform(np.mean))

结果为:

981211-20161004161354129-1871175255.png

而在使用transform时,在直接在原来的数据格式下形成新的均值表

这个过程中,经历了数据的拆分,求均值,然后再合并

接下来我们看下更强大的apply

之所以说apply的强大在于,可以我们通过自定义函数,实现我们任何想要的形式对数据进行聚合运算,

但这也是apply相对而言较难的地方,关键点在于如何构造自定义函数。

data=pd.DataFrame({'level':['a','b','c','b','a'],

'num':[3,5,6,8,9],

'num1':[2,5,9,6,8]})

def fun(data):

return data.groupby('level').agg(['mean','sum'])

print(data)

结果为:

981211-20161004163545301-1044840554.png

print(data.groupby('level').apply(fun))

结果为:

981211-20161004163608629-130849691.png

最后,在数据分析中,我们经常要用到的一个excel功能是数据透视表,这对我们观察数据规律十分有帮助,

在python中也可以通过pivot_table实现数据透视功能

data=pd.DataFrame({'level':['a','b','c','b','a'],

'key':['one','two','one','two','one'],

'num':[3,5,6,8,9],

'num1':[2,5,9,6,8]})

print(data)

结果为:

981211-20161004165034567-1713067454.png

print(data.pivot_table(index='key',columns='level'))

结果为:

981211-20161004170335660-1846116340.png

当然只有你调整参数内容就可以像excel中随心所欲的变化行列位置,这里的计数结果默认为均值,用其他聚合函数可以通过aggfunc参数进行设置。

另外还有一个用于计算分组频率的cosstab,使用方法比pivot_table要简单些,形式也类似于execl的数据透视表功能。

print(pd.crosstab(data.key,data.level,margins=True))

结果为

981211-20161004171133926-1137967377.png



推荐阅读
author-avatar
水果jia
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有