本文主要目的:了解数据分组聚合,熟悉pivot_table函数,应用于数据处理,提高数据处理效率
![f49309ef98a453e22a4895cb393bbbb2.png](https://i-blog.csdnimg.cn/blog_migrate/9e5c4c8beac8615ca84bd790b5d627fc.jpeg)
同Excel数据透视表方法
在Excel中我们可以轻而易举地实现数据透视表功能,“插入——数据透视表——拖动选项——完成透视表”。
但数据达到一定量级时,Excel会无法支持,这时候Python中的pivot_table函数就能完美胜任,分组聚合不在话下,方便高效
首先,观看官方文档对pandas.pivot_table函数的解释:
pandas.pivot_table (data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)
fill_value: 空值的填充值;
dropna: 如果某列元素都为np.nan, 是否丢弃;
margins: 汇总列, margins_name: 汇总名称
margins参数默认为False,如果设置为True,会得到每列的汇总
下面,进行实战演练
- 导入必要库
import pandas as pdimport numpy as np
- 导入数据集
tips=pd.read_csv(r'C:甥敳獲AdministratorDesktopseaborn-data-masterips.csv')tips.head()---------------------结果:
![5f8f173df516d0b85bcc28c2232cd550.png](https://i-blog.csdnimg.cn/blog_migrate/acb61cc3648ac88caa4e1b96379ca2dd.jpeg)
图1
- 先看下除data/index参数(这两参数必有)外无其他参数的数据透视
pd.pivot_table(tips,index=['day'])#默认求平均数#同#tips.groupby('day').mean()-------------------结果:
![47e430cc72a6ce4986011203a52aeb7e.png](https://i-blog.csdnimg.cn/blog_migrate/473751ead2c084f0ad8286e62ba83fca.jpeg)
图2
- 加入values参数进行数据透视
#values参数可以控制聚合的数值列pd.pivot_table(tips,index=['day'],values=['total_bill'])#同#tips[['total_bill','day']].groupby('day').mean(
![e26b477ac45d99118aa26b845d8ed7e2.png](https://i-blog.csdnimg.cn/blog_migrate/b54285619d9e5b2a08dccd6274e952e2.jpeg)
图3
- 加入columns参数进行数据透视
#参数columns将允许我们定义一个或多个列#index与columns是离散型数据,分类数据,且两参数的列不能有重复pd.pivot_table(tips,index=['day','time'],values=['total_bill','tip'],columns=['sex'])--------------------------结果:
![d2d6cb87030ce68d072a76119ef50b37.png](https://i-blog.csdnimg.cn/blog_migrate/5972dda8166db7f67491f978fdd481a2.jpeg)
图4
- 加入aggfunc参数进行数据透视(aggfunc可以用列表list或字典dic来设置)
#1、列表方式#这个参数决定你对数值的聚合计算方式,没加这参数默认的是对数据求平均数pd.pivot_table(tips,index=['day','time'],values=['total_bill','tip','size'],columns=['sex'],aggfunc=[np.sum])-----------------结果:
![a8492e2f50a07b4850d311a4ce756510.png](https://i-blog.csdnimg.cn/blog_migrate/116e680f2b87458d00aae51229eb4e47.jpeg)
图5
#2、字典方式(可以对不同列进行不同的函数聚合)pd.pivot_table(tips,index=['day','time'],columns=['sex'],values=['total_bill','tip','size'],aggfunc={'total_bill':np.sum,'tip':np.max,'size':np.min}----------------结果:
![ba90c997b1fb3832d96e6dc4e80efbad.png](https://i-blog.csdnimg.cn/blog_migrate/eedcc5a95947b11ee0cf10f2694f118e.jpeg)
图6
- 加入fill_value参数进行数据透视(对NaN的填充)
#对非数值(NaN)全部被填充为0pd.pivot_table(tips,index=['day','time'],columns=['sex'],values=['total_bill','tip','size'],aggfunc={'total_bill':np.sum,'tip':np.max,'size':np.min},fill_value=0)----------------------结果:
![c32e430ffc50d8e901f7350e94bdc880.png](https://i-blog.csdnimg.cn/blog_migrate/e651da8601ab6a12c9ba9b6acc2aec81.jpeg)
图7
- 加入margins参数进行数据透视
#增加汇总列//使用参数margins。#margins默认为False,可以设置为True开启汇总列的计算#只对使用求和sum列增加汇总列pd.pivot_table(tips,index=['day','time'],columns=['sex'],values=['total_bill','tip','size'],aggfunc={'total_bill':np.sum,'tip':np.sum,'size':np.min},fill_value=0,margins=True)-----------------结果:
![f1494fbec61cec317354bba02f22d608.png](https://i-blog.csdnimg.cn/blog_migrate/2e5b0382a3dcb25887d9d34be0ca58a7.jpeg)
图8
- 延伸// 数据透视后的筛选
#1、首先将数据透视表保存到变量file中file=pd.pivot_table(tips,index=['day','time'],columns=['sex'],values=['total_bill','tip','size'],aggfunc={'total_bill':np.sum,'tip':np.sum,'size':np.min},fill_value=0,margins=True)
#2、然后查询筛选需要用到query函数#单个条件筛选file.query("day=='Fri'")----------------结果:
![6768085089a4188df46fae5a027b4f91.png](https://i-blog.csdnimg.cn/blog_migrate/a7d00a322f8bc9af96c24173fc915d7d.jpeg)
图9
#多个条件筛选(query函数中,条件用括号含括,多个条件之间用&连接)file.query("(day=='Fri')&(time=='Dinner')")----------------结果:
![03817efec043dc7ca9070371c2c2ba78.png](https://i-blog.csdnimg.cn/blog_migrate/0180bcd7557ac8ca45013915fbebd4e6.jpeg)
图10
总结:Python提供了分组聚合的高效函数pivot_table,同Excel数据透视表方式一样,但pivot_table函数在处理高量级数据是更优于Excel,工具是手段,提高数据处理效率是关键。
参考文献:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html
数据集:如需请留言
寄语:厚积而薄发