天天看點

pandas——交叉表與透視表

1.使用povit_table函數建立透視表

利用pivot_table函數可以實作透視表,pivot_table()函數的常用參數及其使用格式如下。

pands.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',fill_value=None, margins=False, dropna=True, margins_name=ca

參數名稱 說明
data 接收DataFrame。表示建立表的資料。無預設。
values 接收字元串。用于指定想要聚合的資料字段名,預設使用全部資料。預設為None。
index 接收string或list。表示行分組鍵。預設為None。
columns 接收string或list。表示列分組鍵。預設為None。
aggfunc 接收functions。表示聚合函數。預設為mean。
margins

接收boolearn。表示彙總(Total)功能的開關,設為True後結果集中會出現名為“ALL”的行

和列。預設為True

dropna 接收boolearn。表示是否删掉全為NaN的列。預設為False

pivot_table函數主要的參數調節

在不特殊指定聚合函數aggfunc時,會預設使用numpy.mean進行聚合運算,numpy.mean會自動過濾

掉非數值類型資料。可以通過指定aggfunc參數修改聚合函數。

和groupby方法分組的時候相同,pivot_table函數在建立透視表的時候分組鍵index可以有多個。

通過設定columns參數可以指定列分組。

當全部資料列數很多時,若隻想要顯示某列,可以通過指定values參數來實作。

當某些資料不存在時,會自動填充NaN,是以可以指定fill_value參數,表示當存在缺失值時,以指定數

值進行填充。

可以更改margins參數,檢視彙總資料。

2.使用crosstab函數建立交叉表

crosstab函數

交叉表是一種特殊的透視表,主要用于計算分組頻率。利用pandas提供的crosstab函數可以制作交叉表,

crosstab函數的常用參數和使用格式如下。

Ø 由于交叉表是透視表的一種,其參數基本保持一緻,不同之處在于crosstab函數中的index,columns,

values填入的都是對應的從Dataframe中取出的某一列。

pandas.crosstab(index, columns, values=None, rownames=None, colnames=None,

aggfunc=None, margins=False, dropna=True, normalize=False)

crosstab的常用參數及其說明

參數名稱 說明
index 接收string或list。表示行索引鍵。無預設。
columns 接收string或list。表示列索引鍵。無預設
values 接收array。表示聚合資料。預設為None
aggfunc 接收function。表示聚合函數。預設為None。
rownames 表示行分組鍵名。無預設。
colnames 表示列分組鍵名。無預設
dropna 接收boolearn。表示是否删掉全為NaN的。預設為False。
margins

接收boolearn。預設為True。彙總(Total)功能的開關,設為True

後結果集中會出現名為“ALL”的行和列。

normalize 接收boolearn。表示是否對值進行标準化。預設為False
import pandas as pd
import numpy as np

detail = pd.read_excel('./meal_order_detail.xlsx')

###data 用于建立表的資料
data = detail[['order_id', 'dishes_id', 'dishes_name', 'counts', 'amounts']]
##data  用于建立表的資料
# values 關心的資料,用于統計分析的資料
# index 按照這個進行 行分組
# aggfunc ----->可以指定統計函數
# fill_value----->可以指定空值填充類型
# margins----->每統計完一次,行的統計和
###按照order_id 進行 行分組,統計amounts 和counts的均值
res= pd.pivot_table(data,values=['amounts','counts'],index='order_id')
print(res)

###按照dishes_name 進行列分組,統計amounts 和counts的均值
res = pd.pivot_table(data, values=['amounts', 'counts'], columns='dishes_name', aggfunc='max')
print(res)

###按照dishes_name 進行列分組,按照order_id 進行 行分組 ,統計amounts 和counts的均值
res = pd.pivot_table(data, values=['amounts', 'counts'], columns='dishes_name', index='order_id', fill_value=0)
print(res)


###建立交叉表
###必須指定 index,columns,values,aggfunc
##可以隻傳行和列,用于統計兩列資料的頻率
res = pd.crosstab(index=detail['order_id'],columns=detail['amounts'],dropna=True,margins=True)
print(res)
           

繼續閱讀