第五章 变形

Datawhale开源内容链接: https://datawhalechina.github.io/joyful-pandas/build/html/%E7%9B%AE%E5%BD%95/ch5.html

1、长宽表介绍。

这里的长与宽都是针对于某一个特征来说的。比如,将性别作为列名且该列的元素都是性别的值时,这就称为关于性别的长表。但将性别的unique值作为列名且该列元素是其他索引的值时,则称为关于性别的宽表

以上的长表与宽表,从信息角度上看,是等价的。但在呈现的方式上有所不同。所以本章节主要学习这两种表之间的变换–变形函数

2、长表变宽表—pivot。

df = pd.DataFrame({'Class':[1,1,2,2],'Name':['San Zhang', 'San Zhang', 'Si Li', 'Si Li'],'Subject':['Chinese','Math','Chinese','Math'],'Grade':[80,75,90,85]})
df
df.pivot(index='Name', columns='Subject', values='Grade')


变形过程图解

⚠️注意:利用pivot进行变形操作需要满足唯一性的要求,即由于在新表中的行列索引对应了唯一的value,因此index与columns对应的两个列的组合必须唯一。

将pivot的三个参数设置为列表(这就意味着会返回多级索引)。

df = pd.DataFrame({'Class':[1, 1, 2, 2, 1, 1, 2, 2],'Name':['San Zhang', 'San Zhang', 'Si Li', 'Si Li', 'San Zhang', 'San Zhang', 'Si Li', 'Si Li'],'Examination':['Mid', 'Final', 'Mid', 'Final', 'Mid', 'Final', 'Mid', 'Final'],'Subject':['Chinese', 'Chinese', 'Chinese', 'Chinese', 'Math', 'Math', 'Math', 'Math'],'Grade':[80, 75, 85, 65, 90, 85, 92, 88],'rank':[10, 15, 21, 15, 20, 7, 6, 2]})
df


【题目】
将测试类型和科目联合组成的四个类别(期中语文、期末语文、期中数学、期末数学)转到列索引,并且同时统计成绩和排名。


【思考】
从上图可以看出,我最初是将Examination作为了外层行索引,返回的值中关于Mid的两个值并没有合并,这是因为原数据中Examination就是交叉着排列的,但Subject是顺序排列的。所以将Subject设置为外层索引的时候,就可以自动折叠合并啦。

pivot_table可以通过聚合操作将相同行列组合对应的多个值变为一个值。
df = pd.DataFrame({'Name':['San Zhang', 'San Zhang', 'San Zhang', 'San Zhang', 'Si Li', 'Si Li', 'Si Li', 'Si Li'],'Subject':['Chinese', 'Chinese', 'Math', 'Math', 'Chinese', 'Chinese', 'Math', 'Math'],'Grade':[80,90,100,90,70,80,85,95]})
df
## 张三和李四都参加了两次语文考试和数学考试,最后的成绩是两次考试分数的平均值。
df.pivot_table(index = 'Name',columns = 'Subject',values = 'Grade',aggfunc = 'mean')

3、宽表变长表。

df = pd.DataFrame({'Class':[1,2],'Name':['San Zhang', 'Si Li'],'Chinese':[80, 90],'Math':[80,75]})
df
## 将subject以列索引的形式存储,将其压缩至一个列中
df_melted = df.melt(id_vars = ['Class','Name'],value_vars = ['Chinese', 'Math'],var_name = 'Subject',value_name = 'Grade')
df_melted


变形过程图解

wide_to_long

与melt只能压缩同一层含义的列元素不同的是,wide_to_long可以将包含交叉特征的索引分开,只压缩其中一部分特征。

df = pd.DataFrame({'Class':[1,2],'Name':['San Zhang', 'Si Li'],'Chinese_Mid':[80, 75], 'Math_Mid': [90, 85],'Chinese_Final':[80, 75], 'Math_Final': [90, 85]})
df
pd.wide_to_long(df,stubnames=['Chinese','Math'],i = ['Class', 'Name'],j = 'Examination',sep = '_',suffix = '.+')

【题目】
将Grade扩充为语文和数学两列,只把期中期末压缩:

变形过程图解

【补充】
修改列名的两种方法:
1、直接替换之前的全部列名:

df.columns = ['A','B']

2、只替换对应列的列名:

res.rename(columns={'Subjec':'Subject'},inplace=True)

注意:需要添加inplace=True,否则只是暂时修改,并没有改DataFrame里面的值。

将pivot多列操作的结果,利用wide_to_long函数转换为原来的形态。

df = pd.DataFrame({'Class':[1, 1, 2, 2, 1, 1, 2, 2],'Name':['San Zhang', 'San Zhang', 'Si Li', 'Si Li', 'San Zhang', 'San Zhang', 'Si Li', 'Si Li'],'Examination':['Mid', 'Final', 'Mid', 'Final', 'Mid', 'Final', 'Mid', 'Final'],'Subject':['Chinese', 'Chinese', 'Chinese', 'Chinese', 'Math', 'Math', 'Math', 'Math'],'Grade':[80, 75, 85, 65, 90, 85, 92, 88],'rank':[10, 15, 21, 15, 20, 7, 6, 2]})
df
pivot_multi = df.pivot(index=['Class','Name'], columns=['Subject', 'Examination'], values=['Grade','rank'])
pivot_multi
res = pivot_multi.copy()
res

res.columns = res.columns.map(lambda x:'_'.join(x))
res = res.reset_index()
res = pd.wide_to_long(res, stubnames=['Grade','rank'],i = ['Class', 'Name'],j = 'Subject_Examination',sep = '_',suffix = '.+')
res = res.reset_index()
res[['Subject','Examination']] = res['Subject_Examination'].str.split('_', expand=True)
res = res[['Class','Name','Examination','Subject','Grade','rank']].sort_values('Subject')
res = res.reset_index(drop=True)
res

4、索引的变形

unstack函数的作用是:把行索引转为列索引。
stack函数的作用是:把列索引的层压入行索引。

【总结】
上面介绍的所有函数中,除了带有聚合效果的pivot_table以外,其他函数在变性前后并不会带来values个数的变化,只是这些值在呈现的形式上发生了变化。
values的个数是否产生了变化,这是分组聚合与变形函数的最大区别。

5、其他变形函数

crosstab可以统计元素组合出现的频数,即count操作。
explode能够将某一列的元素进行纵向的展开,被展开的单元格必须存储list, turple, Series, np.ndarray中的一种类型。
get_dummies的作用是把类别特征转为指示变量。例如,对年级一列转为指示变量,属于某一个年级的对应位置标记为1,否则为0。这个函数在特征构建时经常使用。

练习题1: 美国非法药物数据集

1、将数据转化为下面图的格式。

【我的解答】

这个没什么难度,其实就是把YYYY这一列的值转换为列索引。直接使用pivot即可,不过我最初是把重置索引和重命名分开来做的,但是后面的操作还是会基于原始的pivot,所以就把它们写为一句了。

df = pd.read_csv('joyful-pandas-master/data/drugs.csv')
pivot1 = df.pivot(index=['State','COUNTY','SubstanceName'], columns='YYYY', values='DrugReports').reset_index().rename_axis(columns={'YYYY':''})
pivot1


2、将第1问的结果恢复为原表。

【我的解答】

df_melted = pivot1.melt(id_vars = ['State','COUNTY','SubstanceName'],value_vars = pivot1.columns[-8:],var_name = 'YYYY',value_name = 'DrugReports')
df_melted.dropna(subset=['DrugReports'])

我最初没有使用dropna去掉空值,导致保留了很多不必要的行。

3、按 State 分别统计每年的报告数量总和,其中 State, YYYY 分别为列索引和行索引,要求分别使用 pivot_table 函数与 groupby+unstack 两种不同的策略实现,并体会它们之间的联系。

pivot_table:

res = df.pivot_table(index='YYYY', columns='State',values='DrugReports', aggfunc='sum')
res

groupby+unstack:

res = df.groupby(['State', 'YYYY'])['DrugReports'].sum().to_frame().unstack(0).droplevel(0,axis=1)
res

Pandas学习-Task05相关推荐

  1. Pandas组队学习Task05

    Pandas组队学习Task05 import pandas as pd import numpy as np path = r"C:\Users\yongx\Desktop\data&qu ...

  2. python中 s是什么意思_什么是Pandas?Pandas学习什么?

    pandas数据分析核心工具包,基于numpy构建,为数据分析而存在!具有以下特点: 1.一位数组Series+二维数组Dataframe 2.可直接读取数据做处理 3.兼容各种数据库 4.支持各种分 ...

  3. 用 Scikit-Learn 和 Pandas 学习线性回归

    对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了. from https://www.cnblogs.com ...

  4. pandas python2_Python数据分析之pandas学习(二)

    有关pandas模块的学习与应用主要介绍以下8个部分: 1.数据结构简介:DataFrame和Series 2.数据索引index 3.利用pandas查询数据 4.利用pandas的DataFram ...

  5. 用scikit-learn和pandas学习线性回归

    from http://www.cnblogs.com/pinard/p/6016029.html by 刘建平Pinard 十年码农,对数学统计学,数据挖掘,机器学习,大数据平台,大数据平台应用开发 ...

  6. Pandas学习导图

    Pandas在线学习网站(强烈推荐):第一章 预备知识 - Joyful Pandas 1.0 documentation Pandas学习导图

  7. Pandas 学习手册中文第二版:1~5

    原文:Learning pandas 协议:CC BY-NC-SA 4.0 译者:飞龙 一.Pandas 与数据分析 欢迎来到<Pandas 学习手册>! 在本书中,我们将进行一次探索我们 ...

  8. pandas学习笔记:pandas.Dataframe.rename()函数用法

    pandas学习笔记:pandas.Dataframe.rename()函数用法 pandas.Dataframe.rename()函数主要是用来修改Dataframe数据的行名和列名. 主要用到的参 ...

  9. Pandas学习(3)——Pandas基础

    本文基于Datawhale提供的Pandas学习资料. 均为本人理解,如有不足或错误地方欢迎补充批评指正,如有侵权,联系速删. 开始学习前,请确认已经安装了 xlrd, xlwt, openpyxl ...

  10. Pandas学习笔记(一)

    Pandas学习笔记一 Pandas数组读取 读取csv.tsv.txt文件 读取excel文件 读取mysql数据表 Pandas数据结构 创建Series的几种方法 根据标签查询Series数据 ...

最新文章

  1. mysqldump和xtrabackup备份原理实现说明
  2. 随机森林为何要有放回抽样
  3. sql server varchar最大长度_来自灵魂的拷问—知道什么是SQL执行计划吗?
  4. ASP.NET(C#)常用数据加密和解密方法汇总
  5. adaboost mh matlab,Adaboost算法的前世今生
  6. 第一个极小的机器学习的应用
  7. java kaptcha_java相关:kaptcha验证码使用方法详解
  8. 【剑指offer】面试题66:构建乘积数组(Java)
  9. C++---------之--------【虚析构函数】
  10. JS正则:按中英文逗号 中英文分号 回车 空格分隔/切割字符串
  11. 触发器(SR锁存器、SR触发器、JK触发器、D触发器、T触发器)
  12. FFMPEG视频编码 NVIDIA 和 INTEL 硬件加速 x265 8bit 和 10bit
  13. Unity--游戏字幕
  14. Mac电脑下好用的mac版远程控制远程桌面软件
  15. DSM-830源网荷系统控制终端(源网荷智能互动终端)-新型电力负荷控制终端(电力负荷管理终端装置)-互动式需求侧管理终端-专变采集终端的功能。DSM-830交互式需求侧管理终端(需求侧管理互动式终端
  16. 这么设置USB Copy数据就能轻松备份到NAS
  17. 微型计算机典型cpu是,微型计算机的件组成.doc
  18. 三元催化器 - 汽车熄火后底盘金属砰砰响 / 啪啪啪 / 哒哒哒的声响 / 异响
  19. Wyn Enterprise 嵌入式商业智能和报表软件
  20. 好用的在线加密解密工具,亲测有用

热门文章

  1. 雷顿学院大数据(一期课程)
  2. python 操作word页眉表格_pythondocx读写word文档:插入图片和表格,设置表格样式、章节、页眉、页脚等,Pythondocx,Word...
  3. Android 显示大尺寸图片
  4. maven的pom出现cannot reconnect错误
  5. 快速实现M5311NBIOT MQTT通信
  6. Vue暴露的属性和方法
  7. 程序控制结构-飞机超速报警系统
  8. Token的组成部分
  9. UOJ【UR #12】实验室外的攻防战 题解
  10. (三万字长文)面试redis缓存大全!