小白学 Python 数据分析(12):Pandas (十一)数据透视表(pivot_table)

人生苦短,我用 Pythonhtml

前文传送门:python

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

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

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

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

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

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

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

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

小白学 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

原文出处:https://www.cnblogs.com/babycomeon/p/12424812.html

相关文章
相关标签/搜索