数据聚合与分组操作
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)