数据聚合与分组

本文详细介绍了使用Pandas进行数据分组和聚合的基本操作,包括如何通过不同方式分组数据,应用多种函数进行数据聚合,以及如何利用迭代、透视表和交叉表等高级功能。通过实例展示了如何提升数据分析效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本操作

np.random.seed(123)
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)})


df['data1'].groupby(df['key1']).mean() #分组键会作为返回数组的键

df.groupby(['key1','key2'])['data1'].mean()

df.groupby(['key1','key2'])[['data1']].mean() #返回DataFrame形式

df.groupby(['key1','key2'],as_index=False)['data1'].mean() #无索引形式返回

states=np.array(['ohio','calif','calif','ohio','ohio'])
years=np.array(['2005','2005','2006','2005','2006'])
df['data1'].groupby([states,years]).mean() #先把数组join到df里面再执行分组

df.groupby(['key1','key2']).size()

对分组进行迭代

for name,group in df.groupby('key1'):
  print(name)
  print(group)

for (k1,k2),group in df.groupby(['key1','key2']):
  print(k1,k2)
  print(group)

pieces=dict(list(df.groupby('key1'))) #list返回元组元素的序列
print(pieces['b'])

dict(list(df.groupby(df.dtypes,axis=1))) #按列分组

通过字典或Series进行分组

people=pd.DataFrame(np.random.randn(5,5),
  columns=list('abcde'),
  index=['joe','steve','wes','jim','travis'])
people.ix[2:3,['b','c']]=np.nan


mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}
people.groupby(mapping,axis=1).sum()

map_series=pd.Series(mapping)
people.groupby(map_series,axis=1).count()

通过函数对索引操作进行分组

people.groupby(len).sum() #在各个索引值上调用len,按返回值分组

key_list=['one','one','one','two','two']
people.groupby([len,key_list]).sum() #先把数组join到df里面再执行分组

根据索引级别分组

在这里插入图片描述

数据聚合

def peak_to_peak(arr):
  return arr.max()-arr.min()
grouped.agg(peak_to_peak) #每个分组放入自定义函数,聚合所有的返回数组

grouped.describe() #打印每个分组情况

经过优化的groupby的方法

函数名groupby
count计算分组中非NA值数量
sum非NA值的和
mean非NA值的平均值
median非NA值得中位数
std,var无偏(分母位n-1)标准差和方差
min,max非NA值得最小值和最大值
prod非NA的乘积
first,last首个或未个非NA值
quantile计算分位数

多函数应用

grouped['tip_pct'].agg(['mean','std',peak_topeak])

grouped.agg([('foo','mean'),('bar',np.std)])

grouped.agg({'tip_pct':['min','max',np.mean],'size':'sum'})

分组级运算和转换

# 把分组计算数据链接在原表上
k1_means=df.groupby('key1').mean().add_prefix('mean_')
pd.merge(df,k1_means,left_on='key1',right_index=True)

transform把函数应用到分组上,再把数据替换在people上并返回,符合广播原则
在这里插入图片描述

apply应用

  • apply把分组放入定义函数并返回经过处理的分组df,可传入定义额参数
  • 传入额函数可以返回df或dict
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 相当于执行2条
    在这里插入图片描述
    在这里插入图片描述
  • 禁止分组键group_keys
    在这里插入图片描述

分位数和桶分析

在这里插入图片描述
在这里插入图片描述
返回相等数量的桶用labels
在这里插入图片描述

透视表

pivot_table的参数

参数说明
values待聚合的列名称,默认聚合所有列
rows用作分组的列名,结果的行坐标
cols用作分组的列名,结果的列坐标
aggfunc聚合函数,默认‘mean’
fill_value用作替换结果NA值
margins添加行列小计/总和

交叉表

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值