Pandas进阶伍 变形

pandas进阶系列根据datawhale远昊大佬的joyful pandas教程写一些自己的心得和补充,本文部分引用了原教程,并参考了《利用Python进行数据分析》、pandas官网

另注:本文是对joyful pandas教程的延伸,完整理解需先阅读joyful pandas教程第五章

目前的进度:学完了内容,做了一个练一练和ex1前两问,都有解决过程,28号早上补完剩余的习题

import numpy as np
import pandas as pd

1. pivot

pivot是一种典型的长表变宽表的函数,首先来看一个例子:下表存储了张三和李四的语文和数学分数,现在想要把语文和数学分数作为列来展示。

【练一练】

在上面的边际汇总例子中,行或列的汇总为新表中行元素或者列元素的平均值,而总体的汇总为新表中四个元素的平均值。这种关系一定成立吗?若不成立,请给出一个例子来说明。

【我的思路】

不一定成立,题目中原本给的数据构造的比较均匀,每人每科刚好都有两个数据,因此造成了边际表的值是均值聚合后的表的行列的均值的假象。
实际上边际表的值还是按照原表的值计算的,下面我更改了原数据(删除了一行数据使其不均匀),就可以看到汇总后的表和原表值不同

df = pd.DataFrame({'Name':['San Zhang', 'San Zhang', 'San Zhang', 'San Zhang','Si Li', 'Si Li', 'Si Li', ],'Subject':['Chinese', 'Chinese', 'Math', 'Math','Chinese', 'Chinese', 'Math'],'Grade':[80, 90, 100, 90, 70, 80, 85]})
df
Name Subject Grade
0 San Zhang Chinese 80
1 San Zhang Chinese 90
2 San Zhang Math 100
3 San Zhang Math 90
4 Si Li Chinese 70
5 Si Li Chinese 80
6 Si Li Math 85

pandas中提供了pivot_table来实现,其中的aggfunc参数就是使用的聚合函数。上述场景可以如下写出:

df.pivot_table(index = 'Name',columns = 'Subject',values = 'Grade',aggfunc = 'mean')
Subject Chinese Math
Name
San Zhang 85 95
Si Li 75 90
df.pivot_table(index = 'Name',columns = 'Subject',values = 'Grade',aggfunc = lambda x:x.mean())
Subject Chinese Math
Name
San Zhang 85 95
Si Li 75 85

此外,pivot_table具有边际汇总的功能,可以通过设置margins=True来实现,其中边际的聚合方式与aggfunc中给出的聚合方法一致。下面就分别统计了语文均分和数学均分、张三均分和李四均分,以及总体所有分数的均分:

df.pivot_table(index = 'Name',columns = 'Subject',values = 'Grade',aggfunc='mean',margins=True)
Subject Chinese Math All
Name
San Zhang 85 95.000000 90.000000
Si Li 75 85.000000 78.333333
All 80 91.666667 85.000000

可以看到,上面这个表中(75+85)/2 != 78.3 因此,边际表是按原表计算的,不是按聚合后的表计算的

【练一练END】

3. melt

长宽表只是数据呈现方式的差异,但其包含的信息量是等价的,前面提到了利用pivot把长表转为宽表,那么就可以通过相应的逆操作把宽表转为长表,melt函数就起到了这样的作用。在下面的例子中,Subject以列索引的形式存储,现在想要将其压缩到一个列中。

df = pd.DataFrame({'Class':[1,2],'Name':['San Zhang', 'Si Li'],'Chinese':[80, 90],'Math':[80, 75]})
df
Class Name Chinese Math
0 1 San Zhang 80 80
1 2 Si Li 90 75
df_melted = df.melt(id_vars = ['Class', 'Name'],value_vars = ['Chinese', 'Math'],var_name = 'Subject',value_name = 'Grade')
df_melted
Class Name Subject Grade
0 1 San Zhang Chinese 80
1 2 Si Li Chinese 90
2 1 San Zhang Math 80
3 2 Si Li Math 75

melt的主要参数和压缩的过程如下图所示:

前面提到了meltpivot是一组互逆过程,那么就一定可以通过pivot操作把df_melted转回df的形式:

df_unmelted = df_melted.pivot(index = ['Class', 'Name'],columns='Subject',values='Grade')
df_unmelted # 下面需要恢复索引,并且重命名列索引名称
Subject Chinese Math
Class Name
1 San Zhang 80 80
2 Si Li 90 75
df_unmelted = df_unmelted.reset_index().rename_axis(columns={'Subject':''})
df_unmelted.equals(df)
True

3. get_dummies

one-hot编码
get_dummies是用于特征构建的重要函数之一,其作用是把类别特征转为指示变量。例如,对年级一列转为指示变量,属于某一个年级的对应列标记为1,否则为0:

pd.get_dummies(df.Grade).head()
Freshman Junior Senior Sophomore
0 1 0 0 0
1 1 0 0 0
2 0 0 1 0
3 0 0 0 1
4 0 0 0 1

四、练习

Ex1:美国非法药物数据集

现有一份关于美国非法药物的数据集,其中SubstanceName, DrugReports分别指药物名称和报告数量:

df = pd.read_csv('../data/drugs.csv').sort_values(['State','COUNTY','SubstanceName'],ignore_index=True)
df.head(3)
YYYY State COUNTY SubstanceName DrugReports
0 2011 KY ADAIR Buprenorphine 3
1 2012 KY ADAIR Buprenorphine 5
2 2013 KY ADAIR Buprenorphine 4

第一问:我的思路是首先可以确定是长变宽,所以要用pivot,利用前面的带颜色的分割图,在结果图中也分色块展示一下,目标的结果如图所示,所以就确定了参数分别应该选哪几列。

tmp = df.pivot(index=['State', 'COUNTY', 'SubstanceName'], columns='YYYY',values='DrugReports')
tmp = tmp.reset_index().rename_axis(columns={'YYYY':''})
tmp.head()
State COUNTY SubstanceName 2010 2011 2012 2013 2014 2015 2016 2017
0 KY ADAIR Buprenorphine NaN 3.0 5.0 4.0 27.0 5.0 7.0 10.0
1 KY ADAIR Codeine NaN NaN 1.0 NaN NaN NaN NaN 1.0
2 KY ADAIR Fentanyl NaN NaN 1.0 NaN NaN NaN NaN NaN
3 KY ADAIR Heroin NaN NaN 1.0 2.0 NaN 1.0 NaN 2.0
4 KY ADAIR Hydrocodone 6.0 9.0 10.0 10.0 9.0 7.0 11.0 3.0
tmp.columns[-8:]
Index([2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017], dtype='object', name='')

第二问:这里发现一个神奇的事,上一问的2010,2011这些列,竟然不是字符串表示的,而是数字表示的

tmp.melt(id_vars=['State', 'COUNTY', 'SubstanceName'],value_vars=list(range(2010, 2018)),var_name='YYYY',value_name='DrugReports').dropna()
State COUNTY SubstanceName YYYY DrugReports
4 KY ADAIR Hydrocodone 2010 6.0
6 KY ADAIR Methadone 2010 1.0
13 KY ALLEN Hydrocodone 2010 10.0
15 KY ALLEN Methadone 2010 4.0
17 KY ALLEN Oxycodone 2010 15.0
... ... ... ... ... ...
49702 WV WOOD Hydrocodone 2017 8.0
49704 WV WOOD Isobutyryl fentanyl 2017 3.0
49707 WV WOOD Oxycodone 2017 1.0
49708 WV WOOD Tramadol 2017 3.0
49709 WV WYOMING Buprenorphine 2017 1.0

24062 rows × 5 columns

Pandas进阶伍 变形相关推荐

  1. 【Python】开启Pandas进阶:图解Pandas透视表、交叉表

    一.图解Pandas透视表.交叉表 终于开始Pandas进阶内容的写作了.相信很多人都应该知道透视表,在Excel会经常去制作它,来实现数据的分组汇总统计.在Pandas中,我们把它称之为pivot_ ...

  2. Python for Data Analysis_2nd_Task 5 之 Pandas 进阶

    Python for Data Analysis_2nd_Task 5 之 Pandas 进阶 十道经典练习,使用Pandas,一起玩转数据分析 开始了解你的数据:探索 Chipotle 快餐数据 数 ...

  3. pandas进阶03--高级应用篇

    pandas进阶03–高级应用篇 接上一篇:https://blog.csdn.net/sinat_30353259/article/details/80776905 目录介绍: 06.pandas高 ...

  4. Pandas进阶修炼120题

    作者:刘早起 来源:早起python,禁止二次转载 这篇文章是『Pandas进阶修炼120题』的汇总,我们对Pandas中常用的操作以习题的形式发布.从读取数据到高级操作全部包含,希望可以通过刷题的方 ...

  5. Pandas 进阶知识学习

    文章目录 Pandas 进阶学习 导语 Pandas分组聚合 分组 Series系列分组 通过数据类型或者字典分组 获取单个分组 对分组进行迭代 聚合 应用单个聚合函数 应用多个聚合函数 自定义函数传 ...

  6. pandas进阶用法(一)筛选条件、多重索引、缺失值

    一篇比较好的pandas指南,适合已经熟悉pandas,并想掌握一些进阶用法的读者,不适合对pandas完全不了解的新人.文章大部分是Stack Overflow常见问题集合. pandas 官网 原 ...

  7. Pandas进阶修炼120题,给你深度和广度的船新体验

    来源:早起Python 本文约5800字,建议阅读15分钟. 本文为你介绍Pandas基础.Pandas数据处理.金融数据处理等方面的一些习题. Pandas 是基于 NumPy 的一种数据处理工具, ...

  8. Pandas进阶大神!从0到100你只差这篇文章!

    作者:youerning 来源:51CTO博客 阅读文本大概需要 8 分钟 一.数据对象 pandas主要有两种数据对象:Series.DataFrame 注: 后面代码使用pandas版本0.20. ...

  9. 【头歌】Pandas进阶

    第1关:Pandas分组聚合 import pandas as pd import numpy as np#返回最大值与最小值的差 def sub(df):######## Begin ####### ...

最新文章

  1. DCT如此重要,作者当初竟然不知道?
  2. .NET5.0 Preview 8 开箱教程
  3. 信息学奥赛一本通(1186:出现次数超过一半的数)
  4. python 抓取微博评论破亿_如果利用Python分析14亿条数据!资深程序员手把手教你!过亿级!...
  5. linux终端什么字体舒服,推荐一款 Linux 上比较漂亮的字体
  6. java创建一个单链表,接受输入的数据,并输出
  7. python文件操作完成_基于python的文件操作
  8. arduino环境下用ESP32连接PS2手柄
  9. Linux du命令和df命令
  10. 解决win10系统无法玩红警或者兼容性卡死问题
  11. HTML中淡入的动画效果,利用CSS3制作淡入淡出动画效果
  12. 一个喷嚏就能传播病毒?关于病毒,还有多少是你不知道的?
  13. TCL电子软件开发生活记录(更新中)
  14. 计量经济学及Stata应用 陈强 第九章模型设定与数据问题习题9.5
  15. 使用go get安装,老是报错:go: golang.org/x/tools@v0.0.0-20190322203728-c1a832b0ad89: unrecognized import path
  16. python func函数用法_python函数局部变量用法实例分析
  17. copy(copy)
  18. 【Python 每日一技】建立多个值和单个键的映射
  19. php 制作生成海报 图片合成 文字合成 上传到OSS
  20. H5数据可视化(高德地图绘制行政区)

热门文章

  1. 计算机24游戏怎么玩,外媒评24款史上最好玩的策略游戏 投身宏伟场景玩到爆
  2. 5G千兆路由器工业物联网应用
  3. wangEditor 5 - 修改工具栏 toolbar 默认背景色(去掉背景颜色改为透明)
  4. 懒人理财法之基金定投(Automatic Investment Plan)
  5. 【转载】测试面试知识点
  6. Java学习从这里开始
  7. 核对(checking)与测试 (testing) -- Part 1
  8. 华为AR路由器的无线AC和AP分别是指什么
  9. 移动CMPP3.0短信网关接口协议
  10. 关于STM32 IAP升级之为什么APP执行要0x2FFE0000这个数值的原因(基于STM32F446RET6)