层及索引levels,刚开始学习pandas的时候没有太多的操作关于groupby,仅仅是简单的count、sum、size等等,没有更深入的利用groupby后的数据进行处理。近来数据处理的时候有遇到这类问题花了一点时间,所以这里记录以及复习一下:(以下皆是个人实践后的理解)
我使用一个实例来讲解下面的问题:一张数据表中有三列(动物物种、物种品种、品种价格),选出每个物种从大到小品种的前两种,最后只需要品种和价格这两列。
以上这张表是我们后面需要处理的数据表 (物种 品种 价格)
levels:层及索引 (创建pandas类型时可以预先定义;使用groupby后也会生成)
我们看看levels什么样(根据df1物种分类,再根据df2品种排序后 如下图)
图中可以看出,根据groupby分类后的cat、dog便是level,以及后面的一列原始位置索引也是level
好了现在简单了解levels,我们该如何对它进行处理,如何完成上面的实例呢?(可能你拿到这样的层级数据,不会操作,不知道如何提取其中的信息)
代码及讲解如下:
首先导入pandas、numpy库,以及创建原始数据:
import pandas as pdimport numpy as npdf = pd.DataFrame({'df1':['cat','cat','dog','cat','dog','dog'],'df2':[2,3,4,1,3,1],'df3':[100,200,100,300,200,200]})
原始数据最上面那张图
下面我们根据物种来分类,并且使用apply调用sort_df2函数对品种进行排序:
def sort_df2(data): data = data.sort_values(by='df2',ascending=False) #df2:品种列 ascending:排序方式 return datagroup = df.groupby(df['df1']).apply(sort_df2) #groupby以及apply的结合使用
处理后数据,上面第二张图
print(group.index) #看看groupby后的行索引什么样
groupby后如上图,有层级标签(这里两列),labels标签(分类,位置)
这里我们需要的是第一层级标签的第一列(也就是cat、dog)
levels = group.index.levels[0] #取出第一级标签:
下面将是两层循环,完成从中选出(物种前两个品种以及它的价格),很简单的操作:
values = []for i in levels: mid_group = group.loc[i] #选出i标签物种的所有品种 mid_group = mid_group.iloc[:2,:] #我们只取排序后的品种的前两种(要注意这里使用iloc,它与loc的区别) cnt = len(mid_group) #为了防止循环长度错误,所以我们还是需要计算长度,因为如果真正数据不足2条还是不报错 for j in range(cnt): #现在在每个物种cat、dog中操作 value = mid_group.iloc[j,:] #我们选出该物种的第j条所有信息df1、df2、df3 value_pro = (value['df2'],value['df3']) #然后只取df2、df3,将它们放到元组中 values.append(value_pro)
新闻热点
疑难解答