--------------------------------------------------------------------------------------- -----(一)、GroupBy技术 from pandas import DataFrame,Series import numpy as np import pandas as pd df=DataFrame({ 'key1':['a','a','b','a'],'key2':['one','two','one','one'],'data1':[1,2,3,4,5],'data2':[2,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','Ohio','Ohio']) years=np.array([2005,2005,2006,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','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','two'] people.groupby([len,key_list]).min() -----5.根据索引级别分组 columns=pd.MultiIndex.from_arrays([['US','US','JP','JP'],[1,5,1,3]],names=['cty','tenor']) hier_df=DataFrame(np.random.randn(4,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',('Abweichung',np.var)] grouped['tip_pct','total_bill'].agg(ftuples) 对不同的列应用不同的
函数 grouped.agg({'tip':np.max,'size':'sum'}) grouped.agg({'tip':['min','max','std'],'size':'sum'}) 以无索引的形式返回聚合数据 tips.groupby(['sex','smoker'],as_index=False).mean()