數據集地址: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表示計算列百分比