grouped_single = df.groupby('School')
grouped_mul = df.groupby(['School','Class'])
size()
获取组容量ngroup()
获取组数for name,group in grouped_single:
print(name)
display(group.head(1))
df.set_index(['Gender','School']).groupby(level=0,axis=0).get_group('M')
head()
和first()
:对分组对象使用head函数,返回的是每个组的前几行,而不是数据集前几行;first显示的是以分组为索引的每组的第一个分组信息。grouped_single.head(2)
grouped_single.first()
[]
选出groupby对象的某个或者某几个列。如:df.groupby(['Gender','School'])[['Math','Height']]
cut()
函数对数字进行分组。bins
参数为分组列表。所谓聚合就是把一堆数,变成一个标量,因此mean/sum/size/count/std/var/sem/describe/first/last/nth/min/max
都是聚合函数。
group_m.agg(['sum','mean','std'])
group_m.agg([('rename_sum','sum'),('rename_mean','mean')])
grouped_mul.agg({'Math':['mean','max'],'Height':'var'})
grouped_single['Math'].agg(lambda x:x.max()-x.min())
def R1(x):
return x.max()-x.min()
def R2(x):
return x.max()-x.median()
print(grouped_single['Math'].max())
grouped_single['Math'].agg(min_score1=pd.NamedAgg(column='col1', aggfunc=R1),
max_score1=pd.NamedAgg(column='col2', aggfunc='max'),
range_score2=pd.NamedAgg(column='col3', aggfunc=R2)).head()
# 判断是否组内数学分数至少有一个值在50-52之间
def f(s,low,high):
return s.between(low,high).max()
grouped_single['Math'].agg(f,50,52)
# 如果需要使用多个函数,并且其中至少有一个带参数,则使用wrap技巧
def f_test(s,low,high):
return s.between(low,high).max()
def agg_f(f_mul,name,*args,**kwargs):
def wrapper(x):
return f_mul(x,*args,**kwargs)
wrapper.__name__ = name
return wrapper
new_f = agg_f(f_test,'at_least_one_in_50_52',50,52)
grouped_single['Math'].agg([new_f,'mean']).head()
filter函数是用来筛选某些组的(务必记住结果是组的全体),因此传入的值应当是布尔标量
grouped_single[['Math','Physics']].filter(lambda x:(x['Math']>32).all())
# all()表示全部为Ture时进行过滤
df_nan = df[['Math','School']].copy().reset_index()
df_nan.loc[np.random.randint(0,df.shape[0],25),['Math']]=np.nan # 0-35的随机数,25个
df_nan.groupby('School').transform(lambda x: x.fillna(x.mean())).join(df.reset_index()['School'])
在第一章里面介绍过,apply函数使用相当灵活,因此其应用也是最为广泛。
apply函数的灵活性体现在以下几个方面:
# 返回标量
df[['School','Math','Height']].groupby('School').apply(lambda x:x.max())
# 返回列表
df[['School','Math','Height']].groupby('School').apply(lambda x:x-x.min())
# 返回数据框
df[['School','Math','Height']].groupby('School')\
.apply(lambda x:pd.DataFrame({'col1':x['Math']-x['Math'].max(),
'col2':x['Math']-x['Math'].min(),
'col3':x['Height']-x['Height'].max(),
'col4':x['Height']-x['Height'].min()}))
可以借助OrderedDict工具进行快捷的统计。
from collections import OrderedDict
def f(df):
data = OrderedDict()
data['M_sum'] = df['Math'].sum()
data['W_var'] = df['Weight'].var()
data['H_mean'] = df['Height'].mean()
return pd.Series(data)
grouped_single.apply(f)
如什么问题,欢迎留言交流,觉得有用的小伙伴顺手点个赞吧。
你的肯定是我的最大动力!