数据准备
一份药品销售记录
uniquekeys = ['PMD_YEAR', 'PMD_QUARTER', 'PMD_CITY', 'PMD_MEDICINALINFORMATIONID', 'PMD_COMPANYID',
'PMD_MEDICINALSALENUMBER']
count()
作用在所有不在uniquekeys给定的列上,生成一个由uniquekeys做多级索引的DateFrame。比如df中的列为[a,b,c,d,e], uniquekeys=[a,b,c], 那么count()会同时作用在[d,e]列上, 而[a,b,c]成为多级索引。info()可以看到相关信息。通常没有必要在[d,e]列上各做一次count,当df中的列数特别多时,就更不推荐这么用了。
# data.groupby(uniquekeys).count().info()#.reset_index()
也可以用as_index=False设置不生成多级索引
# data.groupby(uniquekeys, as_index=False).count().info()#.reset_index()
reset_index()可以将多级索引转换为普通的列。
# data.groupby(uniquekeys).count().reset_index()
size()
结果中只会保留uniquekeys中存在的列, 并新增一个名叫'counts'的计数列。 也是呈目录树状的级联结构,但它不是一个DateFrame, 查看类型会发现是Series。可以用reset_index转换成DateFrame。
type(data.groupby(uniquekeys).size())
reset_index()直接作用在size()后面,再赋予新增的计数列列名'counts'可以得到一个看上去干净清爽的DateFrame, 同时满足获取各个group的计数的需求。
# data.groupby(uniquekeys).size().reset_index(name='counts')
size()方法后直接用to_frame()方法也可以得到DateFrame, 它只有唯一一列'counts', info()显示uniquekeys为这个DataFrame的多级索引。reset_index()方法仍然可以将这些索引转换成列,而自动加上默认的自增索引。
data.groupby(uniquekeys).size().to_frame(name='counts').info()#.reset_index()
groupby
得到的每个group都可以看作一个DataFrame, apply的作用对象是每个组的数据, 可以用类似处理DataFrame的方法选取其中的部分列进行计算。比如下面",".join(x["PMD_COMPANYID"])操作将每个group中的PMD_COMPANYID列的数据拼接起来。
data[["PMD_CITY", "PMD_COMPANYID"]].groupby(["PMD_CITY"]).apply(lambda x: ",".join(x["PMD_COMPANYID"]))