2015-04-01-数据聚合与分组运算(1)-GroupBy技术+数据聚合

---------------------------------------------------------------------------------------
-----(一)、GroupBy技术
from pandas import DataFrame,Series
import numpy as np
import pandas as pd
df=DataFrame({
'key1':['a','a','b','b','a'],
'key2':['one','two','one','two','one'],
'data1':[1,2,3,4,5],
'data2':[2,3,4,6,10]
})


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


means=df['data1'].groupby([df['key1'],df['key2']]).mean()
层次化索引
means.unstack()


分组键可以是任何长度适当的数组
states=np.array(['Ohio','California','California','Ohio','Ohio'])
years=np.array([2005,2005,2006,2005,2006])
df['data1'].groupby([states,years]).mean()


可以将列名用作分组键
df.groupby('key1').mean()
df.groupby(['key1','key2']).mean() 


返回一个含有分组大小的Series
df.groupby(['key1','key2']).size()
-----1.对分组进行迭代
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')))


可以根据dtype对列进行分组
df.dtypes
grouped=df.groupby(df.dtypes,axis=1)
dict(list(grouped))
-----2.选取一个或一组列
df.groupby('key1')['data1']
df.groupby('key1')[['data1']]


df['data1'].groupby(df['key1'])
df[['data1']].groupby(df['key1'])


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


s_grouped=df.groupby(['key1','key2'])['data2']
s_grouped
s_grouped.mean()
-----3.通过字典或Series进行分组
people=DataFrame(np.random.randn(5,5),
columns=['a','b','c','d','e'],
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'}
by_column=people.groupby(mapping,axis=1)
by_column.sum()


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


-----4.通过函数进行分组
people.groupby(len).sum()


key_list=['one','one','one','two','two']
people.groupby([len,key_list]).min()


-----5.根据索引级别分组
columns=pd.MultiIndex.from_arrays([['US','US','US','JP','JP'],[1,3,5,1,3]],names=['cty','tenor'])
hier_df=DataFrame(np.random.randn(4,5),columns=columns)
hier_df
hier_df.groupby(level='cty',axis=1).count()
---------------------------------------------------------------------------------------
-----(二)、数据聚合
样本分位数
grouped=df.groupby('key1')
grouped['data1'].quantile(0.9)


如果使用你自己的聚合函数,只需将其传入aggregate或agg方法即可
def peak_to_peak(arr):
    return arr.max()-arr.min()


grouped.agg(peak_to_peak)


grouped.describe()
-----------------------
经过优化的GroupBy的方法
count       分组中非NA值的数量
sum         非NA值的和
mean        非NA值的平均值
median      非NA值的算术中位数
std、var    无偏(分母为n-1)标准差和方差
min、max    非NA值的最小值和最大值
prod        非NA值的积
first、last 第一个和最后一个非NA值
-----------------------
------1.面向列的多函数应用
tips=pd.read_csv(r'ch08\tips.csv')
tips['tip_pct']=tips['tip']/tips['total_bill']


grouped=tips.groupby(['sex','smoker'])
grouped_pct=grouped['tip_pct']
grouped_pct.agg('mean')


grouped_pct.agg(['mean','std',peak_to_peak])


传入由(name,function)元素组成的列表
grouped_pct.agg([('foo','mean'),('bar',np.std)])


functions=['count','mean','max']
result=grouped['tip_pct','total_bill'].agg(functions)
result
result['tip_pct']


传入带有自定义名称的元组列表:
ftuples=[('Durchschnitt','mean'),('Abweichung',np.var)]
grouped['tip_pct','total_bill'].agg(ftuples)


对不同的列应用不同的函数
grouped.agg({'tip':np.max,'size':'sum'})
grouped.agg({'tip':['min','max','mean','std'],'size':'sum'})


以无索引的形式返回聚合数据
tips.groupby(['sex','smoker'],as_index=False).mean()





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值