数据聚合与分组训练

Groupby技术

基础知识

先上代码:

df =pd.DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})
#print(df)
print(df.groupby(['key1','key2']).mean().reset_index())

运行结果为:
运行
mean()函数表示的是:取平均值。
reset_index()表示重新排列索引

利用函数进行分组

people=pd.DataFrame(np.random.randn(5,5),columns=['a','b','c','d','e'],index=['joe','steve','wes','jim','travis'])
print(people)
print(people.groupby(len).sum())

运行结果为:
在这里插入图片描述

其中,len代表根据根据行索引的长度进行排序

print(people.groupby(len).sum().add_prefix('sum_'))

运行结果为:
在这里插入图片描述

用特定的分组填充缺失值

group_key=['a']*2+['b']*3
fun=people.groupby(group_key)
func=lambda g:g.fillna(g.mean())
print(fun.apply(func))

apply

apply会讲待处理的对象拆分成多个片段,然后对各个片段调用传入的函数,最后尝试将各个片段组合到一起
apply()括号中的内容可以是一个函数,会讲该函数添加到前面的DataFrame中,或者是一个Lamdba表达式,可以讲该表达式添加就=进去

示例:分组加权平均数和相关系数

df2=pd.DataFrame({'category':['a','a','a','a','b','b','b','b'],'data':np.random.randn(8),'weights':np.random.randn(8)})
fun2=lambda g:np.average(g['data'],weights=g['weights'])
print(df2.groupby('category').apply(fun2))

透视表

pivot_table
参数

value:待聚合的列的名称,默认聚合所有数据列
rows:用于分组的列名或其他分组键,出现在结果透视表的行
cols:用于分组的列名或其他分组见,出现在结果透视表的列
aggfunc:聚合函数或函数列表,默认为‘mean’。可以是任何对groupby有效的函数
fill_value:用于替换结果表中的缺失值
margins天街行/列小记或总计,默认为false

交叉表

df2=pd.DataFrame({'category':['a','a','a','a','b','b','b','b'],'data':np.random.randn(8),'weights':np.random.randn(8)})
#print(df2.groupby('category').apply(fun2))
print(pd.pivot_table(df2,index=['data'],columns='category',aggfunc='count',fill_value=0))
print(pd.crosstab(df2['data'],df2['category']))

交叉表是一种用于计算分组频率的特殊透视表。交叉表可以用透视表代替,例如上面这个例子,就是交叉表和透视表的通用功能的两种体现,看一下运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值