数据集地址:https://pan.baidu.com/s/1kMH1AhE8RUyaT73rvJsVPQ
提取码:aai6
数据分组方法
• 使用groupby方法进行分组计算,得到分组对象GroupBy
• 语法为df.groupby(by=)
• 分组对象GroupBy可以运用描述性统计方法, 如count、mean 、 median
、 max和min等
练习
import pandas as pd
import numpy as np
import os
os.chdir(r'G:\pythonProject\pc\Python数据清洗\data')
1.1在线杂货店订单数据
customer :消费者ID,一个消费者可能有多个订单
order :订单ID,订单的唯一标识,不重复
total_items :订单中购买的商品数量
discount% :收到的总折扣百分比
weekday :下单时间:星期几下单,1-7 为 周一至周日
hour :下单时间:几点下单,0-23 为二十四小时制
Food% :食物在订单总价中占比,食物为非生鲜类食物
Fresh% :生鲜类食物在订单总中占比
Drinks% :饮品在订单总价占比,由于高糖税可能导致总折扣为负
Home% :家居用品在订单总价中占比
Beauty% : 美妆类产品在订单总价中占比
Health% :保健类产品在订单总价中占比
Baby% :母婴类产品在订单总价占比
Pets% :宠物用品在订单总价占比
df = pd.read_csv('online_order.csv',encoding = 'gbk',dtype={'customer':str,'order':str})
df.dtypes
1.2 数据分组运算
df.groupby(‘a’)
df.groupby(by = [‘a’,‘b’])
df[[‘a’,‘b’,‘c’]].groupby(‘a’)
df[[‘a’,‘b’,‘c’]].groupby(by = [‘a’,‘b’])
- 使用单个分组变量
- 使用groupby方法
df.head(4)#查看数据
grouped = df.groupby('weekday') #创建分组对象,按照星期进行分组
grouped.mean() #调用方法
grouped.sum()['total_items']# 计算不同的星期,商品数量的总和
grouped = df.groupby(by =['customer','weekday'])#创建分组对象,按照用户和星期
grouped.sum()['total_items'].head(50) #调用方法,计算不同的用户周一到周天的订购商品数量的总和
聚合函数使用
edu.csdn.net
聚合函数使用
• 对分组对象使用agg聚合函数
• Groupby.agg(func)
• 针对不同的变量使用不同的统计方法
练习
grouped = df.groupby('weekday')#创建分组对象,按照周一到周天进行分组
grouped.agg([np.mean,np.max]).head(20) #对分组后对象,计算均值和总和
grouped.agg({'total_items':np.sum,'Food%': [np.mean,np.median]}) #对2个变量分别计算不同的统计量
df[['total_items','Food%','Drinks%']].agg([np.sum,np.mean]) #也可以直接对数据进行
分组对象与apply函数
• 函数apply即可用于分组对象,也可以作用于dataframe数据
• Groupby.apply(func)
• 需要注意axis=0和axis=1的区别
练习
grouped = df.groupby('weekday')
grouped.apply(np.mean)[['total_items','Food%']] #可以做聚合
- 体验一下apply 中,axis=0 或者 axis=1的区别
df.columns
var_name = ['Food%', 'Fresh%', 'Drinks%', 'Home%', 'Beauty%', 'Health%', 'Baby%',
'Pets%'] # 不同类型的商品占比
df[var_name].apply(np.sum,axis = 0) #相当于计算每列的总和
df['sum'] = df[var_name].apply(np.sum,axis=1) # 相当于计算每行的总和
var_name.append('sum')
df[var_name] #查看数据,会发现总和为1
limit_output extension: Maximum message size of 10000 exceeded with 15572 characters
df[var_name].apply(lambda x: x[0] - x[1],axis = 1) #计算食物在订单总价中占比 - 生鲜类食物在订单总中占比
透视图与交叉表
在数据分析中,数据透视表是常见的工具之一,需要根据行或列对数据
进行各个维度数据的汇总,在pandas中,提供了相关函数解决此类问题
交叉表更多用于频数的分析
pivot_table( data, index, columns,values, aggfunc, fill_value,
margins, margins_name=)
Index : 行分组键
columns: 列分组键
values: 分组的字段,只能为数值型变量
aggfunc: 聚合函数
margins: 是否需要总计
交叉表用于计算分组频率
pd.crosstab(index,columns,normalize)
Index: 行索引
Columns: 列索引
Normalize: 数据对数据进行标准化,index表示行,column表示列
练习
#读取数据
df = pd.read_csv('online_order.csv',encoding = 'gbk',dtype={'customer':int,'order':str})
df.columns
# 单个变量
#margin =True 表示是否需要总计
pd.pivot_table(data= df,index='weekday',values='total_items',aggfunc=[np.sum,np.size],margins=True,margins_name='总计')#按照周一到周天计算购买的商品数量总数和次数
交叉表
交叉表更多用于计算分组频率
# 使用交叉表
#是一种计算分组频数的特殊透视表
# 不同的星期,不同的折扣交叉表
pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True)
#按照行进行汇总,计算频数占比
pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True, normalize='all')
pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True, normalize='columns') #index表示计算行百分比,columns表示计算列百分比