python数据清洗实战入门笔记(五)数据统计


数据集地址:https://pan.baidu.com/s/1kMH1AhE8RUyaT73rvJsVPQ
提取码:aai6

数据分组方法

image-20200517200005296

• 使用groupby方法进行分组计算,得到分组对象GroupBy
• 语法为df.groupby(by=)
• 分组对象GroupBy可以运用描述性统计方法, 如count、mean 、 median
、 max和min等

image-20200517200054388

练习

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

image-20200517200754210

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)#查看数据

image-20200517201051806

grouped = df.groupby('weekday') #创建分组对象,按照星期进行分组
grouped.mean() #调用方法

image-20200517201148137

grouped.sum()['total_items']# 计算不同的星期,商品数量的总和

image-20200517201420211

grouped = df.groupby(by =['customer','weekday'])#创建分组对象,按照用户和星期
grouped.sum()['total_items'].head(50) #调用方法,计算不同的用户周一到周天的订购商品数量的总和

image-20200517201502510

聚合函数使用

edu.csdn.net
聚合函数使用
• 对分组对象使用agg聚合函数
• Groupby.agg(func)
• 针对不同的变量使用不同的统计方法

image-20200517200121401

练习

grouped = df.groupby('weekday')#创建分组对象,按照周一到周天进行分组
grouped.agg([np.mean,np.max]).head(20) #对分组后对象,计算均值和总和

image-20200517201704423

grouped.agg({'total_items':np.sum,'Food%': [np.mean,np.median]}) #对2个变量分别计算不同的统计量

image-20200517201741092

df[['total_items','Food%','Drinks%']].agg([np.sum,np.mean]) #也可以直接对数据进行

image-20200517201801398

分组对象与apply函数

• 函数apply即可用于分组对象,也可以作用于dataframe数据
• Groupby.apply(func)
• 需要注意axis=0和axis=1的区别

image-20200517200216904

image-20200517200232828

练习

grouped = df.groupby('weekday')
grouped.apply(np.mean)[['total_items','Food%']] #可以做聚合

image-20200517201929768

  • 体验一下apply 中,axis=0 或者 axis=1的区别
df.columns

image-20200517202010442

var_name = ['Food%', 'Fresh%', 'Drinks%', 'Home%', 'Beauty%', 'Health%', 'Baby%',
       'Pets%'] # 不同类型的商品占比
df[var_name].apply(np.sum,axis = 0) #相当于计算每列的总和

image-20200517202031497

df['sum'] = df[var_name].apply(np.sum,axis=1) #  相当于计算每行的总和
var_name.append('sum')
df[var_name] #查看数据,会发现总和为1

image-20200517202107632

limit_output extension: Maximum message size of 10000 exceeded with 15572 characters

df[var_name].apply(lambda x: x[0] - x[1],axis = 1) #计算食物在订单总价中占比 - 生鲜类食物在订单总中占比

image-20200517202158159

透视图与交叉表

在数据分析中,数据透视表是常见的工具之一,需要根据行或列对数据
进行各个维度数据的汇总,在pandas中,提供了相关函数解决此类问题
交叉表更多用于频数的分析

image-20200517200251313

pivot_table( data, index, columns,values, aggfunc, fill_value,
margins, margins_name=)
Index : 行分组键
columns: 列分组键
values: 分组的字段,只能为数值型变量
aggfunc: 聚合函数
margins: 是否需要总计

image-20200517200309518

交叉表用于计算分组频率
pd.crosstab(index,columns,normalize)
Index: 行索引
Columns: 列索引
Normalize: 数据对数据进行标准化,index表示行,column表示列

image-20200517200329119

练习

#读取数据
df = pd.read_csv('online_order.csv',encoding = 'gbk',dtype={'customer':int,'order':str})
df.columns

image-20200517202358371

# 单个变量
#margin =True 表示是否需要总计
pd.pivot_table(data= df,index='weekday',values='total_items',aggfunc=[np.sum,np.size],margins=True,margins_name='总计')#按照周一到周天计算购买的商品数量总数和次数

image-20200517202415841

交叉表

交叉表更多用于计算分组频率

# 使用交叉表
#是一种计算分组频数的特殊透视表
# 不同的星期,不同的折扣交叉表
pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True)

image-20200517202458002

#按照行进行汇总,计算频数占比
pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True, normalize='all')

image-20200517202523015

pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True, normalize='columns') #index表示计算行百分比,columns表示计算列百分比

image-20200517202546082

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章