dataframe groupby_Pandas——groupby练习

Occupation

1)csv文件

67897a6ea51eaf2c398082414b63722b.png

2)读取数据

import pandas as pd
users = pd.read_table('occupation.csv', sep=',', index_col='user_id') #sep='t'指定分隔符默认默认t,index_col=None,指定某列为索引
users.head() 

ac6a7040d347014972da9c1e7adc23d8.png

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

fce2d67a17cb3e9d26e63ac6dc893e9f.png

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文件

ae6b922ce68324141a9775466a1bc1f8.png

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()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值