引言

前文我们介绍了数据分组,今天我们接着介绍一个和数据分组很相似的内容,是数据透视表,从名字上来看是不是感觉没半毛钱关系,实际不然,数据分组是从一维(行)的角度上对数据进行了拆分,如果我们想从二维的角度上(行和列)同时对数据进行拆分呢?

这就需要用到我们今天的主角,数据透视表了。

数据透视表

什么是数据透视表?小编的灵魂画手上线:

图画的不好,各位同学凑合理解。

在 Excel 中,其实也有数据透视表这个东西,在插入中全选数据后点击数据透视表,就会出来这么个东西:

点击确定后会有这么个画面:

具体在 Excel 中如何使用各位同学可以百度查一下,毕竟这里是讲 Python 的地方,关于 Excel 的操作就不多说了,Pandas 的操作和 Excel 的使用还是比较相似的。

在 Pandas 中,实现数据透视表是使用的 pivot_table() 这个方法,首先还是放个官方文档,防止有同学找不到。

官方文档地址: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html 。

再看下 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) → 'DataFrame'

  • data: 需要做数据透视的整个表
  • values: 要汇总的数据项
  • index: 在数据透视表索引上进行分组的键
  • columns: 在数据透视表列上进行分组的键
  • aggfunc: 对 values 的计算类型
  • fill_value: 空值的填充值
  • margins: 是否显示合计
  • dropna: 是否删除缺失,如果未是,则删除缺失数据的那一行
  • margins_name: 合计类的列名

下面我们来看示例,数据集还是使用上篇文章使用的疫情数据集,先看个简单的示例,我们按照七大洲,看下当前的确诊情况:

import pandas as pd# 数据导入
epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")df = pd.pivot_table(epidemic_dxy, values='currentConfirmedCount', index='continents', aggfunc='sum')print(df)# 输出内容currentConfirmedCount
continents
亚洲                           5458
其他                            699
北美洲                            99
南美洲                             8
大洋洲                            14
欧洲                           2040
非洲                              3

可以看到,和我们前面的文章中,按照七大洲直接分组的结果是一致的。

这个示例中的 currentConfirmedCount 是我们要统计的值, continents 是我们要拆分的索引, aggfunc 中的 sum 是我们对需要统计的值的统计方式。

这里只是按照一维的方式进行拆分,和分组并没有实际上的区别,接下来我们看从二维的方向上对数据进行拆分:

import pandas as pd# 数据导入
epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")df1 = pd.pivot_table(epidemic_dxy, values='currentConfirmedCount', index='continents', columns='provinceName', aggfunc='sum')print(df1)# 输出内容
provinceName   丹麦  亚美尼亚  以色列   伊拉克     伊朗  ...   阿曼   阿联酋      韩国  马来西亚  黎巴嫩
continents                                 ...
亚洲            NaN   1.0  9.0  19.0  749.0  ...  5.0  16.0  4283.0  11.0  3.0
其他            NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN
北美洲           NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN
南美洲           NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN
大洋洲           NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN
欧洲            3.0   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN
非洲            NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN[7 rows x 65 columns]

因为内容比较多,大部分的内容被折叠掉了。

在上面这个示例中,我们按照七大洲和国家对整个数据表进行了横纵向的拆分,可以看到,整个表中会有很多空值,拿亚洲那一行举例子,因为在我们的原始数据中只有亚洲只有 26 个国家,所以,理论上亚洲那一行应该只有那 26 个国家有数据,实际上也确实如此。

那么,现在有一个简单的小问题,如果我想要知道每条数据的创建时间( createTime 字段),这个也能行么?

当然可以, pivot_table 支持在横纵向拆分的时候传入一个数组的,如下,我们在 index 上再加一个新的参数 createTime :

import pandas as pd# 数据导入
epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")df2 = pd.pivot_table(epidemic_dxy, values='currentConfirmedCount', index=['continents', 'createTime'], columns='provinceName', aggfunc='sum')print(df2)# 输出内容
provinceName               丹麦  亚美尼亚  以色列   伊拉克  ...   阿联酋      韩国  马来西亚  黎巴嫩
continents createTime                           ...
亚洲         1583138990000  NaN   NaN  9.0  19.0  ...  16.0  4283.0  11.0  3.01583138991000  NaN   1.0  NaN   NaN  ...   NaN     NaN   NaN  NaN
其他         1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN
北美洲        1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN1583138991000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN
南美洲        1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN1583138991000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN
大洋洲        1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN
欧洲         1583138990000  3.0   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN1583138991000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN
非洲         1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN[11 rows x 65 columns]

这样,我们就得到了一个新的按照三个规则分别进行横纵向拆分的 DataFrame ,当然,这个 DataFrame 目前并不是一个标准的 DataFrame ,只需要最后一步,使用 reset_index() 重置一下索引就可以了,这里小编就不演示了。

今天的内容比较短,但是对于第一次接触的同学来讲并不是很好理解,建议多动手找个数据集试试看,或者先在 Excel 中进行尝试后再使用 Python 进行理解。

在数据透视表中,获得数据透视表并不难,难点是在于我们想要构建怎么样的新的数据表,我们要真正要获取什么样的数据。

小白学 Python 数据分析(8):Pandas 数据透视表(pivot_table)相关推荐

  1. Pandas数据分析15——pandas数据透视表和交叉表

    参考书目:<深入浅出Pandas:利用Python进行数据处理与分析> pandas对数据框也可以像excel一样进行数据透视表整合之类的操作.主要是针对分类数据进行操作,还可以计算数值型 ...

  2. matplotlib plot 分组_小白学 Python 数据分析(16):Matplotlib(一)坐标系

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  3. 小白学 Python 数据分析(3):Pandas (二)数据结构 Series

    在家为国家做贡献太无聊,不如跟我一起学点 Python 顺便问一下,你们都喜欢什么什么样的文章封面图,老用这一张感觉有点丑 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析( ...

  4. python中for循环缩进_跟小白学Python数据分析——For循环

    原标题:跟小白学Python数据分析--For循环 循环是指反复地连续做某件事,例如地球绕地轴自转一圈就是一天,自转的同时绕太阳公转一圈就是一年.周而复始,转了一圈又一圈,一次又一次地循环. 在编程过 ...

  5. 跟小白学Python数据分析——绘制仪表盘

    本文继续采用PyEcharts v1.x版本进行绘制仪表盘. 注:PyEcharts分为 v0.5.x 和 v1.x 两个大版本,v0.5.x 和 v1.x 间不兼容,v0.5.x是基于Python2 ...

  6. 跟小白学Python数据分析——绘制水球图

    本文继续采用PyEcharts v1.x版本进行绘制水球图. 注:PyEcharts分为 v0.5.x 和 v1.x 两个大版本,v0.5.x 和 v1.x 间不兼容,v0.5.x是基于Python2 ...

  7. Pandas简明教程:八、Pandas数据透视表

    透视表(pivot)是由微软发明的一个概念,1993年微软注册了PivotTable这一商标,而他们又在2020年正式撤销了注册. 关于透视表的话题随便搜搜就是一大堆,而有些地方可能都吹得很神了.透视 ...

  8. pandas 数据透视表

    pandas 数据透视表及逆透视 主要参数说明 pd.pivot_table(df,index= [] ,columns= [] ,values = [] , aggfunc={"Quant ...

  9. python数据透视、有的value不能同时输出_python – Pandas数据透视表ValueError:索引包含重复的条目,无法重新整形...

    我有一个如下所示的数据帧(前3行): Sample_Name Sample_ID Sample_Type IS Component_Name IS_Name Component_Group_Name ...

  10. python多个sheet数据透视表_python 用pandas实现数据透视表功能

    透视表是一种可以对数据动态排布并且分类汇总的表格格式.对于熟练使用 excel 的伙伴来说,一定很是亲切! pd.pivot_table() 语法: pivot_table(data, # dataf ...

最新文章

  1. 【干货】浅谈分布式数据库中间件之分库分表
  2. flutter dart Md5加密
  3. 学习 vuex 源码整体架构,打造属于自己的状态管理库
  4. Membership学习记录
  5. matlabif语句怎么用_公益心 码客行(2)—— 简单语句
  6. 地表反射率影响因素_【热岛强度可影响城市夏季降水落区】
  7. mysql数据库架构_MySQL数据库之互联网常用架构方案
  8. 论文写作——texstudio+texlive
  9. 依赖倒置原则_设计模式之SOLID原则
  10. CF(437C)The Child and Toy(馋)
  11. 基于python的贝叶斯分类算法_Python实现贝叶斯分类器
  12. throws java_基于Java中throw和throws的区别(详解)
  13. android 9.0打开wifi,Android9.0 SystemUI 屏蔽打开wifi时不显示4G图标的逻辑
  14. 转载--Python random模块(获取随机数)常用方法和使用例子
  15. PLSQL官方下载、安装和使用完全指南
  16. 荣耀路由2 虚拟服务器,荣耀路由器2恢复出厂设置的两种方法
  17. 代码对比/归并/两个代码对比,对比代码
  18. SSM的整合项目(详细)
  19. MAE 自监督算法介绍和基于 EasyCV 的复现
  20. Can‘t locate XXX/XXX.pm in @INC (you may need to install the XXX::XXX module)

热门文章

  1. 【最强大脑】天才数学家陶哲轩亲授25条职业建议
  2. ABB机器人示教器上人机界面的功能
  3. python吃显卡还是内存条_内存条与显卡金手指氧化了解决方法
  4. 摄氏度和开氏度的换算_k与摄氏度的换算(摄氏度与开氏度换算)
  5. 步态识别之GaitSet
  6. 《区块链开源技术需求调研报告》拍了拍你
  7. maka html5,MAKA H5制作
  8. java获取linux本机ip_linux下java获取本机IP地址
  9. ANSYS入门例程笔记
  10. SPSS学习(二)作图