1透视表
数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等。所进行的计算与数据跟数据透视表中的排列有关。 之所以称为数据透视表,是因为可以动态地改变它们的版面布置,以便按照不同方式分析数据,也可以重新安排行号、列标和页字段。
数据分析中的透析表十分强大,甚至可以说是相当于分组聚合外加哑变量三个步骤了。但有个前提就是:在使用透析表之前,你必须明确知道自己想要的是什么,需要做什么!
当然,有时候你很难直接看出需求。这时候我们就得添加项目和检查每一步来验证我们一步一步得到期望的结果。为了查看什么样的外观最能满足你的需要,就不要害怕处理顺序和变量的繁琐。
函数
pands.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
名称 | 说明 |
---|---|
data | 接收DataFrame。表示透视表的数据。无默认。 |
values | 接收字符串。用于指定想要聚合的数据字段名,默认使用全部数据。默认为None。 |
index | 接收string或list。表示行分组键。默认为None。 |
columns | 接收string或list。表示列分组键。默认为None。 |
aggfunc | 接收functions。表示聚合函数。默认为mean。 |
fill_value | 接受scalar。表示是否将fill_value的数值代替缺失值。默认为None。 |
margins | 接收boolearn。表示汇总(Total)功能的开关,设为True后结果集中会出现名为“ALL”的行和列。默认为True。 |
dropna | 接收boolearn。表示是否删掉全为NaN的列。默认为False。 |
margins_name | 接收string。表示margins为True时,'All'的名称。 |
OK,下面开始示范。
# 导入库包 import pandas as pd import numpy as np #数据,自编 data = pd.read_csv('./data.csv',encoding='gbk') data.head()
detail_id | order_id | dishes_id | logicprn_name | parent_class_name | dishes_name | itemis_add | counts | amounts | cost | place_order_time | discount_amt | discount_reason | kick_back | add_inprice | add_info | bar_code | picture_file | emp_id | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2956 | 417 | 610062 | NaN | NaN | 蒜蓉生蚝 | 0 | 1 | 49 | NaN | 2016/8/111:05:00 | NaN | NaN | NaN | 0 | NaN | NaN | caipu/104001.jpg | 1442 |
1 | 2958 | 417 | 609957 | NaN | NaN | 蒙古烤羊腿 | 0 | 1 | 48 | NaN | 2016/8/111:07:00 | NaN | NaN | NaN | 0 | NaN | NaN | caipu/202003.jpg | 1442 |
2 | 2961 | 417 | 609950 | NaN | NaN | 大蒜苋菜 | 0 | 1 | 30 | NaN | 2016/8/111:07:00 | NaN | NaN | NaN | 0 | NaN | NaN | caipu/303001.jpg | 1442 |
3 | 2966 | 417 | 610038 | NaN | NaN | 芝麻烤紫菜 | 0 | 1 | 25 | NaN | 2016/8/111:11:00 | NaN | NaN | NaN | 0 | NaN | NaN | caipu/105002.jpg | 1442 |
4 | 2968 | 417 | 610003 | NaN | NaN | 蒜香包 | 0 | 1 | 13 | NaN | 2016/8/111:11:00 | NaN | NaN | NaN | 0 | NaN | NaN | caipu/503002.jpg | 1442 |
# 先看一下数据大小 data.shape
(10037, 19)
# 取4列中的前20行 pd.pivot_table(data[['order_id','counts','amounts','dishes_name']][:20], values=['counts'], index='order_id', columns='dishes_name', aggfunc='count', fill_value=0, margins=False, dropna=True, margins_name='All')
counts | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
dishes_name | 大蒜苋菜 | 干锅田鸡 | 桂圆枸杞鸽子汤 | 爆炒鳝碌 | 番茄有机花菜 | 番茄炖秋葵 | 番茄甘蓝 | 白斩鸡 | 白饭/大碗 | 皮蛋瘦肉粥 | 芝士烩波士顿龙虾 | 芝麻烤紫菜 | 葱姜炒蟹 | 蒙古烤羊腿 | 蒜蓉生蚝 | 蒜香包 | 重庆特色油烧兔 | 长城窖酿解百纳红酒干红葡萄酒 | 香烤牛排 |
order_id | |||||||||||||||||||
301 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
413 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
417 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
2交叉表
交叉表是一种特殊的透视表,主要用于计算分组频率。利用pandas提供的crosstab函数可以制作交叉表,crosstab函数的常用参数和使用格式格式如下。
函数
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)
名称 | 说明 |
---|---|
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。 |
# 与上边透析表一样的行列和值(输出结果有点多,故后边省略) pd.crosstab(index=data['order_id'],columns=data['dishes_name'],values = data['counts'],aggfunc = np.sum)