@
thinszx 不客气,我也是在别人那里学到的,再分享你一些我常用的 groupy 的例子:
# 显示所有组,后面是值的 index'
df_gp = dff.groupby('name')
df_gp.groups
# 拿到某个 group 的值
df_gp.get_group('bryan chen')
# 根据名字的第一部分来 group
dff.groupby(dff.name.str.split(' ').str[0]).size()
# 根据名字中是否有 wittyfans 来 group
dff.groupby(dff.name.apply(lambda x: 'wittyfans' in x)).size()
# 对 groupby 的值,平均分段统计后汇总数量
df_mean.groupby(
pd.qcut(
x=df_mean['AUSTRALIA - AUSTRALIAN DOLLAR/US$'],
q=3,labels=['low','mid','hight']
)
).size()
# 对一列值分组
pd.qcut(
x=df_mean['AUSTRALIA - AUSTRALIAN DOLLAR/US$'],
q=3,labels=['low','mid','hight']
)
# 按照自定义的值来分组
df_mean.groupby(
pd.cut(
df_mean['CHINA - YUAN/US$'],
[6.0,6.5,7.0,7.5,8.0,8.5]
)).size()
# 根据指定日期列来 resmaple,再做分组统计
dff.groupby(
pd.Grouper(
key='start',
freq='d'
)
).size()
# 根据指定日期列来 resmaple,再 apply 你的函数
df.reset_index().groupby(
pd.Grouper(
key='Time Serie',
freq='5Y'
)
)['CHINA - YUAN/US$'].apply(np.mean)
# 根据指定日志来 resample,再结合多个聚合函数
df.reset_index().groupby(
pd.Grouper(
key='Time Serie',
freq='5Y'
)
).agg(
{
'HONG KONG - HONG KONG DOLLAR/US$':'mean',
'CHINA - YUAN/US$':['median','std','mean']
})
# 偶尔 groupy 重命名很麻烦,可以这样写:(pandas>=2.5)
aggregation = {
'china': ('CHINA - YUAN/US$','mean'),
'hk': ('HONG KONG - HONG KONG DOLLAR/US$','mean')
}
df.groupby('region').agg(**aggregation)
# groupby 返回的是 reduce 的数据,如果要根据某个分类分组,然后再计算单个值占该组的占比,可以这样写
df['%'] = df.groupby('location')['name'].transform(lambda x:x/sum(x))
# 使用 filter 配合 groupby 选择数据
df.groupby('location').filter(
lambda x: (x['worklog'] * x['ticket_num']).sum() > 20000
)
df.groupby('location').filter(
lambda x: (x['worklog'] * x['ticket_num']).mean() > .3
)
上面提到的一些列名,有的来自 kaggle 上的汇率数据,有的是我自己平时处理的数据,不理解的自己实际操作下就懂了。