Occupation
1)csv文件
2)读取数据
import pandas as pd
users = pd.read_table('occupation.csv', sep=',', index_col='user_id') #sep='t'指定分隔符默认默认t,index_col=None,指定某列为索引
users.head()
ps:制表符_360百科
3)题目
1.统计各个职业的平均年龄
users.groupby('occupation')['age'].mean() #users.groupby('occupation').age.mean()
2.计算各职业中男性占本职业的比例,并降序排列
# 可在此定义一个函数
# 创建一个新列gender_num,对gender列应用一个函数,把男人变为1,女人变为0
(1)方法1
def gender_to_numeric(x):
if x=="M":
return 1
else:
return 0
users['gender_num']=users['gender'].apply(gender_to_numeric)
(2)方法2
users['gender_num']=users['gender'].apply(lambda x:1 if x=="M" else 0)
#统计各个职业男性的总和除以各职业的数量
a=users.groupby('occupation').gender_num.sum()/users.groupby('occupation').gender_num.count()*100
a
# 排序
a.sort_values(ascending=False)
3.统计每个职业(occupation)年龄的最大和最小值
users.groupby('occupation').age.agg(['min','max'])
4.统计每个职业不同性别人群的平均年龄
users.groupby(['occupation','gender']).age.mean()
5.统计每个职业男女的比例
gender_ocup=users.groupby(['occupation','gender']).agg({'gender':'count'})
occup_count=users.groupby('occupation').agg('count')
occup_gender=gender_ocup.div(occup_count,level='occupation')*100
occup_gender.loc[:,'gender']
Regiment
1)创建
import pandas as pd
raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons', 'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'],
'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'],
'name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'],
'preTestScore': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3],
'postTestScore': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 70]}
regiment = pd.DataFrame(raw_data, columns = raw_data.keys())
regiment
2)题目
1.每个军团的平均测试前成绩是多少
regiment.groupby('regiment')['preTestScore'].mean()
2.呈现每个company的统计数据
regiment.groupby('company')['preTestScore','postTestScore'].describe()
3.每个company的平均测试前成绩
regiment.groupby('company')['preTestScore'].mean()
4.每个regiment和company的平均测试前成绩
regiment.groupby(['regiment','company'])['preTestScore'].mean()
5.每个company下的regiment有多少条数据
regiment.groupby(['company','regiment']).agg({'name':'count','preTestScore':'sum'})
drinks
1)csv文件
2)读取数据
import pandas as pd
drinks = pd.read_csv('drinks.csv')
drinks.head()
3)题目
1.每个大洲啤酒消费量的均值
drinks.groupby('continent')['beer_servings'].mean()
2.每个大洲wine消费量的描述信息
drinks.groupby('continent')['wine_servings'].describe()
3.统计每个大洲各种酒类的平均消费量
drinks.groupby('continent')[['beer_servings','spirit_servings','wine_servings','total_litres_of_pure_alcohol']].mean()
4.统计各个大洲酒精消费量的中位数
drinks.groupby('continent')[['beer_servings','spirit_servings','wine_servings','total_litres_of_pure_alcohol']].median()
5.统计每个大洲烈酒消费量的均值,最大值,最小值
# groupby('').agg(['x','y','z'])
drinks.groupby('continent')['total_litres_of_pure_alcohol'].agg(['mean','min','max'])
Sell
1)读取数据
import numpy as np
import pandas as pd
from datetime import datetime
#读取“销售记录。xlsx" 文件
s1 = pd.read_excel('销售记录.xlsx',sheet_name='销售记录')
s2 = pd.read_excel('销售记录.xlsx',sheet_name='2015 任务')
s3 = pd.read_excel('销售记录.xlsx',sheet_name='省份区域')
s4 = pd.read_excel('销售记录.xlsx',sheet_name='产品分类表')
s5 = pd.read_excel('销售记录.xlsx',sheet_name='RFM用户等级')
s1.head()
2)题目
# 查看数据类型并更改为恰当的类型
s1.info()
1. 统计2015年完成任务额度的销售代表
1.1 计算销售额
s1["销售额"] =s1['单价']*s1['数量'] #等价于s1["销售额"] =s1.单价*s1.数量
s1.head()
1.2 构造销售年份和月份
s1['销售年份'] = s1['下单日期'].dt.year
s1['销售月份'] = s1['下单日期'].dt.month
s1.head()
1.3 筛选出2015年的销售数据并计算每个销售代表的销售额
s15 = s1[s1.销售年份==2015]
s15.head()
1.4 计算15年每个销售代表的销售额和15年每个销售代表的任务额
# 15年每个销售代表的销售总额
sale_yet = s15.groupby('销售代表ID')['销售额'].sum()
sale_yet
# 计算s2表中每个销售代表的任务额
task15 = s2.groupby('销售代表ID')['任务额'].sum()
task15
1.5 连接两个销售额和任务额,计算完成情况
# concat连接
s_t = pd.concat([sale_yet,task15],axis=1)
s_t
# 计算完成情况
s_t['完成情况'] =s_t['销售额']-s_t['任务额']
s_t
sum(s_t['完成情况']>0)
2. 各年份销售总额的top3销售代表
2.1 求每年每个销售代表的销售总额并重设索引
#先进行分组得到Series格式的数据
s1.groupby(['销售年份','销售代表ID'])['销售额'].sum()
#两种方法得到DataFrame(重设索引使得索引变成列名)
(1)
temp=s1.groupby(['销售年份','销售代表ID'])['销售额'].sum().reset_index() #drop=True丢弃原来的索引这里不能添加
(2)
temp=s1.groupby(['销售年份','销售代表ID'],as_index=False)['销售额'].sum()
temp
2.2 按年份分组排序找到top3
(1)
temp=s1.groupby(['销售年份','销售代表ID'])['销售额'].sum() #Series
temp.reset_index().groupby('销售年份')['销售代表ID','销售额'].apply(lambda x:x.sort_values('销售额',ascending=False)[:3])#转换成dataframe(全都变成列非索引)再分组排序
ps:
temp.reset_index().groupby('销售年份')[[销售额]].apply(lambda x:x.sort_values('销售额',ascending=False)[:3]) #DataFrame
temp.reset_index().groupby('销售年份')[销售额].apply(lambda x:x.sort_values(ascending=False)[:3])#Series
(2)
s1.groupby(['销售年份','销售代表ID'])[['销售额']].sum().groupby('销售年份',group_keys=False).apply(lambda x:x.sort_values('销售额',ascending=False)[0:3])(对索引继续分组,再添加group_keys=False)
(3)
s1.groupby(['销售年份','销售代表ID']).sum()['销售额'].groupby('销售年份',group_keys=False).nlargest(3) #Series
3. 根据省份区域表(s3)按下单年份统计各区(东,南, 西,北,中)的销售额排名
3.1 把 s3 表中的省份改名为客户省份,并融合 s1 和 s3
s3.rename(columns={'省份':'客户省份'},inplace=True)
s3
sale_merge_district = pd.merge(s1,s3)
sale_merge_district
#按下单年份统计各区(东,南, 西,北,中)的销售额,订单量
3.2 按年份和区域对销售额分组求和
a=sale_merge_district.groupby(['销售年份','区域'])['销售额'].sum()
a
3.3 对上一步销售额求top3
(1)
a.groupby(by='销售年份',group_keys=False).apply(lambda x:x.sort_values(ascending=False)[:3]) ##有点问题
(2)
4. 根据产品分类表计算每个产品分类的销售排名
4.1 融合销售记录表(s1)和产品分类表(s4)¶
sale_merge_prod = pd.merge(s1,s4,on='产品ID',suffixes=['_订单表','_销售表'])
sale_merge_prod.head()
4.2 按类统计产品的销售总额,销售总量
# 按类统计产品的销售额,销售量,并对其进行降序排列
sale_prod_sum =sale_merge_prod.groupby('产品分类')['销售额','数量'].sum()
sale_prod_sum
4.3 对上述销售额和销售数量进行降序排列,sort_values(by=['xx','yy'],ascending=[False,False])
sale_prod_sum.sort_values(by=['销售额','数量'],ascending=[False,False])
5. 对每年每月的销售总额和销量总额进行排序
5.1统计每年每月的销售总额和销售数量总额
temp=s1.groupby(['销售年份','销售月份'])[['销售额','数量']].sum()
temp
5.2对上面的结果进行降排,先按销售额排销售额相同则按数量排
temp.groupby('销售年份',group_keys=False).apply(lambda x:x.sort_values(['销售额','数量'],ascending=False))
6. 统计省份订单量的top3
s1['客户省份'].value_counts()[:3] #值计数
7.查看数据一致性
7.1 用值计数或者unique方法查看客户名称都有哪些
s1['客户名称'].value_counts()
7.2 从客户名称中提取用户ID(数字)为新的一列,提取省份为新的一列
#字符串切片
s1['ID']=s1['客户名称'].str[-14:-9]
s1['省份']=s1['客户名称'].str[:-14]
#正则
s1['ID']=s1['客户名称'].str.extract('([0-9]+)', expand=False)
s1['省份']=s1['客户名称'].apply(lambda x:x.split('自')[0]).str.extract('([^0-9]+)',expand=False)
s1
7.3 对比客户ID和新提取的ID是否一致,判断新提取的省份和客户省份是否一致
(1)
any(s1['客户ID']==s1['ID'].astype(np.int64)) #等价于(s1['客户ID']==s1['ID'].astype(np.int64)).any()
(2)
any(s1['客户省份']==s1['省份'])
8. 统计各省的平均送货时长
8.1 计算送货时长
s1['送货时长']=s1['实际送货日期']-s1['下单日期']
s1
8.2 查看送货时长的数据格式,把它转化为int类型(选做)
s1.info()
(1)
s1['送货时长']=s1['送货时长'].astype(str).apply(lambda x:x.split(' ')[0])
s1['送货时长']=s1['送货时长'].astype(int)
s1
(2)
s1['送货时长']=pd.to_numeric(s1['送货时长'])
s1.dtypes
8.3 统计每个省份的平均送货时长
s1.groupby('客户省份')['送货时长'].mean()
9. 统计各产品分类的子分类个数
s4.groupby('产品分类')['产品子分类'].count()
10. 对数据进行RFM分析
#计算R
s1.groupby('客户ID')['下单日期'].max()
# 计算客户的F
s1.groupby('客户ID')['订单编号'].count()
# 计算M
s1.groupby('客户ID')['销售额'].sum()
今天的文章dataframe groupby_Pandas——groupby练习分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/62832.html