专栏名称: 极客挖掘机
高级软件工程师
目录
相关文章推荐
SellerGuard  ·  版权登记:跨境卖家的低成本保护策略 ·  13 小时前  
宁夏药安早知道  ·  以“新”为帆,奋力开拓外贸新空间 ·  2 天前  
宁夏药安早知道  ·  以“新”为帆,奋力开拓外贸新空间 ·  2 天前  
雨果网  ·  重磅!TikTok ... ·  3 天前  
51好读  ›  专栏  ›  极客挖掘机

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

极客挖掘机  · 掘金  ·  · 2020-03-06 02:22

正文

阅读 48

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

人生苦短,我用 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 个国家有数据,实际上也确实如此。







请到「今天看啥」查看全文