由于上一节给大家介绍了很多实用的新功能,因此我们用一次习题为大家巩固一下学到的知识。首先先下载这两个表格: lipsticks.xlsx aiqiyi.xlsx。
下面我们完成两个习题:
习题1
本题采用的是网易考拉海淘网口红一天的销售数据(文件lipsticks.xlsx)。每条数据都包含了品牌、折扣价、原价、是否自营、评论数、国家共6列信息。我们要完成以下任务:
- 统计每种口红的平均折扣价。
- 分别统计每种口红自营评论数总和和非自营的评论数总和。
首先我们先来查看一下表格的结构。把文件存在.py文件的同一目录下,引用起来比较简单:
import pandas as pd
df = pd.read_excel('lipsticks.xlsx')
print(df.head())
了解了基本结构,我们就来实现对应功能了:
gro=df.groupby('品牌')
for gro_name,gro_val in gro:
print('{}的平均折扣价为:{:.2f}'.format(gro_name,gro_val['折扣价'].mean()))
第二问的解决需要我们依据品牌和是否自营为分类依据,然后再利用sum方法进行加和运算,具体实现如下:
gro=df.groupby(['品牌','是否自营'])
for gro_name,gro_val in gro: # gro_name是一个元组类型,里面存储了品牌的名称以及自营状况
print("{}品牌的{}评论和为{}".format(gro_name[0],gro_name[1],gro_val['评论数'].sum()))
习题2
本题采用的是爱奇艺视频数据(文件aiqiyi.xlsx)。共有6万多条电影数据,每条数据包含12列信息,我们的任务是:
- 取出每年电影评分前两名电影的名字
- 哪一年的电影总评分最高
还是和刚才的方法一样,我们先查看以下基本信息:
import pandas as pd
df = pd.read_excel('aiqiyi.xlsx')
pd.set_option('display.max_columns',None) # 输出所有的列信息
print(df.head(2)) # 只查看前两行数据就好
了解好表格结构之后,我们开始解决问题。我们首先需要知道如何对数据集进行排序并取出前两名的名字。大家还记得排序函数sort_values吗?在数据处理篇3讲过的。我们可以使用该函数进行排序 ,然后取出前两行的‘整理后剧名’列:
gro = df.groupby('上映时间')
for gro_name,gro_df in gro:
result = gro_df.sort_values(by='评分',ascending=False)[0:2]
# 对数据集排序,生成依旧为DataFrame类型,可提排序后的前两行
print(gro_name,'\n',result['整理后剧名'])
接下来,完成第二问。我们需要用到sum方法,但是要注意sum方法如果对一个表格使用,会将所有可加列保留下来,并计算出加和,因此我们可以选择把评分列提取出来再做加和,也可以先对表格做加和,然后提取出评分列。在这里,我们使用第二种方法:
year=gro.sum()
news=year.sort_values(by='评分',ascending=False)[0:4] # 取出评分由高到低的前三行
print(news) # 查看内容,了解sum方法
print(news.index.to_list()[0]) #将news的索引以列表形式存储,
#并取出第一个元素,这就是我们要找的评分最高的年份
print(news[0:1]['评分']) # 取出第一行的“评分”列
看到这个结果大家还满意吗?是不是对sum方法有了新认识呢?大家下去可以试试其他统计函数是不是也有类似的特性。习题课就到这里啦,再见~