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

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