数据聚合与分组操作

group by机制

遍历各分组

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')))
pieces['b']

#根据dtype进行分组
df.dtypes
grouped=df.groupby(df.dtypes,axis=1)
grouped
for dtype,group in grouped:
    print(dtype)
    print(group)

选择一列或所有列的子集进行聚合

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

数据聚合

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

使用自己创建的函数进行聚合

def peak_to_peak(arr):
	return arr.max()-arr.min()
grouped=df.groupby('key1')
grouped.agg(peak_to_peak)
#对某列采取不同的聚合方法
grouped.agg([('key1','mean'),('key2',np.std)])

返回不含行索引的聚合数据

#禁用分组键作为索引
tips.groupby(['day','smoker'],as_index=False).mean()
result=tips.groupby('smoker')['tip_pct'].describe()
result.unstack('smoker')
#等价于
f=lambda x:x.describe()
grouped.apply(f)

压缩分组键(group_keys=False)

tips.groupby('smoker',group_keys=False).apply(top)

分位数与桶分析

#cut计算分位数
frame=pd.DataFrame({'data1':np.random.randn(1000),'data2':np.random.randn(1000)})
quartiles=pd.cut(frame.data1,4)#cut将数据分为4个区间
quartiles[:10]#返回每个数据所在的区间

def get_stats(groups):
    return{'min':group.min(),'max':group.max(),'count':group.count(),'mean':group.mean()}
grouped=frame.data2.groupby(quartiles)
grouped
grouped.apply(get_stats).unstack()

#桶分析
grouping=pd.qcut(frame.data1,10,labels=False)
print(grouping)
grouped=frame.data2.groupby(grouping)
grouped.apply(get_stats).unstack()

随机采样与排列

suits=['H','S','C','D']
card_val=(list(range(1,11))+[10]*3)*4
base_names=['A']+list(range(2,11))+['J','K','Q']
print(base_names)
cards=[]
for suit in ['H','S','C','D']:
    cards.extend(str(num)+suit for num in base_names)
deck=pd.Series(card_val,index=cards)
deck[:13]
#随机抽取5个
def draw(deck,n=5):
    return deck.sample(n)
draw(deck)
#基于样本最后的数字聚合
get_suit=lambda card:card[-1]
deck.groupby(get_suit).apply(draw,n=2)

分组加权平均和相关性

grouped=df.groupby('category')
get_wavg=lambda g:np.average(g['data'],weights=g['weights'])#对data列求平均,权重为weight列
grouped.apply(get_wavg)

数据透视表

#数据透视表中,添加总结行&列
tips.pivot_table('tip_pct',index=['time','day'],columns='smoker',aggfunc=len,margins=True)
参数名描述
values需要聚合的列名,默认为聚合所有数值型的列
index在结果透视表的行上进行分组的列名或者其他分组键
columns列上进行分组的列名或者其他分组键
aggfunc函数列表,默认是mean
fill_value在结果表中替换缺失值的值
dropna如果为true,将不含所有条目均为na的列
margins添加行/列小计和的总计

交叉表:crosstab

pd.crosstab(数据1,数据2,参数),其中,数据部分可以是数组或者series

pd.crosstab(data.data1,data.data2,margins=True)
pd.crosstab([tip.time,tips.day],tips.smoker,margins=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值