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)