1.数据的分组
import pandas as pd
df = pd.read_excel('/data/course_data/data_analysis/forbes_2018.xlsx')
#df.group('X'),按照X进行分组
group = df.groupby('gender')
#group.size()可以返回每组的数量,并返回一个含有分组大小的Series
for gender,value in group.size().items():
# 计算每组的占比
accounted = value/df.shape[0]
# 将小数转化成百分数
bb = "%.2f%%" % (accounted * 100)
print('福布斯2018年度亿万富翁中{}共{}位,占比是{}'.format(gender,value, bb))
#代码df['age'].groupby(df['gender'])的逻辑是:取出df中age列数据,并且对该列数据根据df['gender']列数据进行分组操作
group = df['age'].groupby(df['gender'])
# 查看分组,group.groups的结果是一个字典,字典的key是分组后每个组的名字,对应的值是分组后的数据,此方法方便我们产看分组的情况
print(group.groups)
# 根据分组后的名字选择分组
print(group.get_group('F'))
2.对分组进行遍历
import pandas as pd
df = pd.read_excel('/data/course_data/data_analysis/forbes_2018.xlsx')
groups = df.groupby('gender')
#获取分组后名字为F的组,并计算年龄的最小值,最大值,平均值
f_group=groups.get_group('F')
min=f_group['age'].min()
max=f_group['age'].max()
mean=f_group['age'].mean()
print(min,max,mean)
#遍历每个组,group_name为组名,group_df为数据
for group_name,group_df in groups:
print(group_name,group_df.shape)
min_age=group_df['age'].min()
max_age=group_df['age'].max()
mean_age=group_df['age'].mean()
print(min_age,max_age,mean_age)
3.多列分组
import pandas as pd
df = pd.read_excel('/data/course_data/data_analysis/forbes_2018.xlsx')
#列表中列名的顺序不一样,结果不同
group=df.groupby(['country','gender'])
df1 = group.size()
print(df1)
size = df1['Austria']['F']
print(size)
4.对分组后数据进行统计
import pandas as pd
df = pd.read_excel('/data/course_data/data_analysis/forbes_2018.xlsx')
groups = df.groupby('gender')
#自定义函数
def peak_range(df):
"""
返回数值范围
"""
return df.max() - df.min()
for group_name,group_df in groups:
#将函数的名字以字符串的形势存储到列表中,自定义函数无需转换为字符串
f_se = group_df['age'].agg(['max','min','mean',peak_range])
print('{}组的最大年龄是{},最小年龄是{},平均年龄是{}'.format(group_name,f_se[0],f_se[1],f_se[2]))
4.总结
5.典例
(1)本次练习采用的是网易考拉海淘网口红一天的销售数据。每条数据都包含了品牌、折扣价、原价、是否自营、评论数、国家共6列信息。文件路径为data/course_data/data_analysis/lipsticks.xlsx,1. 统计每种口红的平均折扣价。 2. 分别统计每种口红自营评论数总和和非自营的评论数总和。
import pandas as pd
df = pd.read_excel('/data/course_data/data_analysis/lipsticks.xlsx')
print(df.head())
# 1. 统计每种口红的平均折扣价。
# 根据品牌进行分类
groups = df.groupby('品牌')
for group_name,group_df in groups:
mean = group_df['折扣价'].mean()
str_mean = '{}的平均折扣价为{}'.format(group_name,mean)
print(str_mean)
# 2. 分别统计每种口红自营评论数总和和非自营的评论数总和
# 根据品牌列和是否自营列进行分组
groups = df.groupby(['品牌','是否自营'])
for group_name,group_df in groups:
group_sum = group_df['评论数'].sum()
str_sum = '{}{}的评论数为{}'.format(group_name[0],group_name[1],group_sum)
print(str_sum)
(2)本次练习采用的是爱奇艺视频数据。共有6万多条电影数据,每条数据包含12列信息,文件的路径为/data/course_data/data_analysis/aiqiyi.xlsx,以下获取的前五条数据:1. 取出每年电影评分前两名电影的名字 2. 哪一年的电影总评分最高
#第一题答案
import pandas as pd
df = pd.read_excel('/data/course_data/data_analysis/aiqiyi.xlsx')
groups = df.groupby('上映时间')
for group_name,group_df in groups:
result = group_df.sort_values(by='评分',ascending=False)[0:2]
print(group_name,result['整理后剧名'])
#第二题答案
import pandas as pd
df = pd.read_excel('./data/aiqiyi.xlsx')
groups = df.groupby('上映时间')
year=groups.sum().sort_values(by='评分',ascending=False).index.to_list()[0]
print(year)