您的位置:首页 > 其它

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

2015-04-01 22:25 387 查看
---------------------------------------------------------------------------------------

-----(一)、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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: