数据聚合与分组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39532362/article/details/86544559

基本操作

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 添加行列小计/总和

交叉表

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39532362/article/details/86544559