---------------------------------------------------------------------------------------
-----(一)、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()
-----(一)、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()