人生苦短,我用 Python

前文传送门:

小白学 Python 数据分析(1):数据分析基础

小白学 Python 数据分析(2):Pandas (一)概述

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

小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame

小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据

小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择

小白学 Python 数据分析(7):Pandas (六)数据导入

小白学 Python 数据分析(8):Pandas (七)数据预处理

小白学 Python 数据分析(9):Pandas (八)数据预处理(2)

小白学 Python 数据分析(10):Pandas (九)数据运算

小白学 Python 数据分析(11):Pandas (十)数据分组

引言

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

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

数据透视表

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

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

在 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.0
1583138991000 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 NaN
1583138991000 NaN NaN NaN NaN ... NaN NaN NaN NaN
南美洲 1583138990000 NaN NaN NaN NaN ... NaN NaN NaN NaN
1583138991000 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 NaN
1583138991000 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 进行理解。

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

示例代码

老规矩,所有的示例代码都会上传至代码管理仓库 Github 和 Gitee 上,方便大家取用。

示例代码-Github

示例代码-Gitee

小白学 Python 数据分析(12):Pandas (十一)数据透视表(pivot_table)的更多相关文章

  1. 小白学 Python 数据分析(13):Pandas (十二)数据表拼接

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

  2. 小白学 Python 数据分析(10):Pandas (九)数据运算

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

  3. 小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据

    在家为国家做贡献太无聊,不如跟我一起学点 Python 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Panda ...

  4. 小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择

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

  5. 小白学 Python 数据分析(7):Pandas (六)数据导入

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

  6. 小白学 Python 数据分析(8):Pandas (七)数据预处理

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

  7. 小白学 Python 数据分析(9):Pandas (八)数据预处理(2)

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

  8. 小白学 Python 数据分析(11):Pandas (十)数据分组

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

  9. 小白学 Python 数据分析(15):数据可视化概述

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

随机推荐

  1. UIView 的Transform属性以及 CGAffineTransform的使用

    什么是Transform? Transform是一个3×3的矩阵,如下图所示: 通过这个矩阵我们可以对一个坐标系统进行缩放,平移,旋转以及这两者的任意组着操作.而且矩阵的操作不具备交换律,即矩阵的操作 ...

  2. [Usaco2009 Oct]Heat Wave 热浪(裸最短路径)

    链接:https://ac.nowcoder.com/acm/contest/1082/F来源:牛客网 题目描述 The good folks in Texas are having a heatwa ...

  3. 基于Wiki的知识共享平台模型架构

    一.引言 当今的全球化知识经济社会中呈现出信息泛滥和知识更新周期短的现象,知识管理逐渐成为现代企业管理中不容忽视的一环.虚拟企业是基于共识目标而组成的动态协作组织,成员参与的流动性与各成员之间地域分布 ...

  4. 2019-2020-1 20199324《Linux内核原理与分析》第五周作业

    第四章 系统调用的三层机制(上) 知识点总结: 系统调用:系统调用是操作系统为用户态进程与硬件设备进行交互提供的一组接口. 系统调用的功能特性: 把用户从底层的硬件编程中解放出来: 极大地提高了系统的 ...

  5. 科技报告|AD报告|DTIC|PB报告|STAR|ERA|NTIS|DTIC|DOE|EPA|NASA |JPL|

    信息检索-科技报告是灰色文献获取渠道有限. 技术论文中因保密需要,会删除关键性技术. AD报告也产生较早,1951年开始出版.现由美国国防技术情报中心(DTIC:Defence Technical I ...

  6. FFT(快速傅里叶变换) 模板

    洛谷 P3803 [模板]多项式乘法(FFT)传送门 存个板子,完全弄懂之后找机会再写个详解. #include<cstdio> #include<cmath> struct ...

  7. 一、美国国家经济研究局NBER教育经济研究项目工作论文合集

    一.美国国家经济研究局NBER教育经济研究项目工作论文合集 (一)项目地址: American National Bureau of Economic Research - Economics of ...

  8. 总结verilog产生随机数的$random和seed

      $random(seed)是verilog中最简单的产生随机数的系统函数. 在调用系统函数$random(seed)时,可以写成三种样式:1)$random,2)$random(),3)$rand ...

  9. get 传中文,可以通过下面这种方式

    window.location.href=encodeURI("<%=path%>/XXX.XXX?name=中文"); 然后在后台通过new String(reque ...

  10. IOC读取配置文件

    1. 创建一个bean文件 package com.longteng.utils; import org.springframework.beans.factory.annotation.Value; ...