【Pandas学习笔记Task05】:变形
【Pandas学习笔记Task05】:变形
- 一、长宽表的变形
- 1.pivot
- 2. pivot_table
- 3.melt
- 4.wide_to_long
- 二、索引的变形
- 1.stack与unstack
- 三、其他变形函数
- 1.crosstab
- 2.explode
- 四、练习
- 1.EX1:美国非法药物数据集
import numpy as np
import pandas as pd
一、长宽表的变形
长表可以理解为某个特征单独作为列索引;而宽表可以以分组的思想去理解,值是其他特征的,但是这个值还包含着某个特征的影响在里面。
1.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
Class | Name | Subject | Grade | |
---|---|---|---|---|
0 | 1 | San Zhang | Chinese | 80 |
1 | 1 | San Zhang | Math | 75 |
2 | 2 | Si Li | Chinese | 90 |
3 | 2 | Si Li | Math | 85 |
目标是将语文和数学分数作为列来展示。其实也就是将subject列的值作为索引然后来将grade进行对应填值。对于长变宽,要有变形后的行索引、需要转到列索引的列,以及行列索引对应的某个特征(Grade)的值。
df.pivot(index='Name', columns='Subject', values='Grade')
Subject | Chinese | Math |
---|---|---|
Name | ||
San Zhang | 80 | 75 |
Si Li | 90 | 85 |
# df.iloc[1, 2] = 'Chinese'
df.pivot(index='Name', columns='Subject', values='Grade')
# 利用pivot要保证pivot后的行列索引对应的值都是唯一的。
Subject | Chinese | Math |
---|---|---|
Name | ||
San Zhang | 80 | 75 |
Si Li | 90 | 85 |
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]})
pivot_multi = df.pivot(index = ['Class','Name'],columns = ['Subject','Examination'],values = ['Grade', 'rank'])
pivot_multi
Grade | rank | ||||||||
---|---|---|---|---|---|---|---|---|---|
Subject | Chinese | Math | Chinese | Math | |||||
Examination | Mid | Final | Mid | Final | Mid | Final | Mid | Final | |
Class | Name | ||||||||
1 | San Zhang | 80 | 75 | 90 | 85 | 10 | 15 | 20 | 7 |
2 | Si Li | 85 | 65 | 92 | 88 | 21 | 15 | 6 | 2 |
2. pivot_table
pivot_table的使用是用于解决pivot只能对唯一性做变形。这个可以通过聚合将行列组合的多个值变为一个值。
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
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 |
7 | Si Li | Math | 95 |
df.pivot_table(index = 'Name',columns='Subject',values = 'Grade',aggfunc = 'mean')
# 这里aggfunc代表的是要使用的聚合函数
# 如果有重复值,而且未指定aggfunc,pivot_table默认就取平均
Subject | Chinese | Math |
---|---|---|
Name | ||
San Zhang | 85 | 95 |
Si Li | 75 | 90 |
pivot_table还具有边际汇总,利用margins=True来实现。也就是将每一行再执行一次aggfunc
df.pivot_table(index = 'Name',columns='Subject',values = 'Grade',aggfunc = 'median',margins = True)
Subject | Chinese | Math | All |
---|---|---|---|
Name | |||
San Zhang | 85 | 95.0 | 90.0 |
Si Li | 75 | 90.0 | 82.5 |
All | 80 | 92.5 | 87.5 |
总体的汇总为新表中四个元素的平均值.如果是sum或者median,那么sum或者median的是原表的四个值
3.melt
melt可以理解为pivot的相应的逆操作,把宽表转为长表。
df = pd.DataFrame({'Class':[1,2],'Name':['San Zhang', 'Si Li'],'Chinese':[80, 90],'Math':[80, 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 |
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.reset_index().rename_axis(columns={'Subject':''})
Class | Name | Chinese | Math | |
---|---|---|---|---|
0 | 1 | San Zhang | 80 | 80 |
1 | 2 | Si Li | 90 | 75 |
4.wide_to_long
二、索引的变形
1.stack与unstack
将行列索引进行交换,维度会发生变化,这就属于变形。
df = pd.DataFrame(np.ones((4,2)),index =pd.Index([('A', 'cat', 'big'),('A', 'dog', 'small'),('B', 'cat', 'big'),('B', 'dog', 'small')]),columns=['col_1', 'col_2'])
df.unstack()# 默认转化最内层,移动到列索引的最内层
col_1 | col_2 | ||||
---|---|---|---|---|---|
big | small | big | small | ||
A | cat | 1.0 | NaN | 1.0 | NaN |
dog | NaN | 1.0 | NaN | 1.0 | |
B | cat | 1.0 | NaN | 1.0 | NaN |
dog | NaN | 1.0 | NaN | 1.0 |
# unstack也支持多层的转化
df.unstack([0,2]) # 这里不支持传切片
col_1 | col_2 | |||||||
---|---|---|---|---|---|---|---|---|
A | B | A | B | |||||
big | small | big | small | big | small | big | small | |
cat | 1.0 | NaN | 1.0 | NaN | 1.0 | NaN | 1.0 | NaN |
dog | NaN | 1.0 | NaN | 1.0 | NaN | 1.0 | NaN | 1.0 |
三、其他变形函数
1.crosstab
对于crosstab,感觉还是用pivot_table方便。
df = pd.read_csv('data/learn_pandas.csv')
df.pivot_table(index = 'School',columns = 'Transfer',values = 'Name',aggfunc = 'count')
Transfer | N | Y |
---|---|---|
School | ||
Fudan University | 38.0 | 1.0 |
Peking University | 28.0 | 2.0 |
Shanghai Jiao Tong University | 53.0 | NaN |
Tsinghua University | 62.0 | 4.0 |
2.explode
df_ex = pd.DataFrame({'A': [[1, 2],'my_str',{1, 2},pd.Series([3, 4])],'B': 1})
df_ex
A | B | |
---|---|---|
0 | [1, 2] | 1 |
1 | my_str | 1 |
2 | {1, 2} | 1 |
3 | 0 3 1 4 dtype: int64 | 1 |
df_ex.explode('A') # 对某一列纵向展开
A | B | |
---|---|---|
0 | 1 | 1 |
0 | 2 | 1 |
1 | my_str | 1 |
2 | {1, 2} | 1 |
3 | 3 | 1 |
3 | 4 | 1 |
pd.get_dummies(df.Grade).head()# 这是一个DataFrame,将某列的唯一值作为列索引,值0与1代表特征
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 |
四、练习
1.EX1:美国非法药物数据集
df = pd.read_csv('data/drugs.csv').sort_values(['State','COUNTY','SubstanceName'],ignore_index=True)
df.head()
YYYY | State | COUNTY | SubstanceName | DrugReports | |
---|---|---|---|---|---|
0 | 2011 | KY | ADAIR | Buprenorphine | 3 |
1 | 2012 | KY | ADAIR | Buprenorphine | 5 |
2 | 2013 | KY | ADAIR | Buprenorphine | 4 |
3 | 2014 | KY | ADAIR | Buprenorphine | 27 |
4 | 2015 | KY | ADAIR | Buprenorphine | 5 |
res = df.pivot(index=['State','COUNTY','SubstanceName'],columns='YYYY',values='DrugReports')
res = res.reset_index().rename_axis(columns={'YYYY':''})
res.head()
转换数据格式这里直接想到前面的pivot方法。(虽然想到了,但是应用起来还是不熟练,不得不返回去再看一遍)。而且还包含着要去对索引层名字的修改与重置。
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 |
res_melted = res.melt(id_vars = ['State','COUNTY','SubstanceName'],value_vars = res.columns[-8:],var_name = 'YYYY',value_name = 'DrugReports').dropna(subset=['DrugReports'])
res_melted.head()
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 |
res_melted = res_melted[df.columns].sort_values(['State','COUNTY','SubstanceName'],ignore_index=True).astype({'YYYY':'int64', 'DrugReports':'int64'})
res_melted.head()
YYYY | State | COUNTY | SubstanceName | DrugReports | |
---|---|---|---|---|---|
0 | 2011 | KY | ADAIR | Buprenorphine | 3 |
1 | 2012 | KY | ADAIR | Buprenorphine | 5 |
2 | 2013 | KY | ADAIR | Buprenorphine | 4 |
3 | 2014 | KY | ADAIR | Buprenorphine | 27 |
4 | 2015 | KY | ADAIR | Buprenorphine | 5 |
恢复的过程也就是对melt方法的应用。(这里对melt的参数运用还没有理解到位,于是就只能照猫画虎将实例的参数设置对应着搬过来用)。因为第1问的DrugReports格式被改为了float64,所以答案用astype方法将类型重置为int64.
【Pandas学习笔记Task05】:变形相关推荐
- Pandas学习笔记4——变形
Task04:变形(2天) Pandas基础 变形 一.透视表 1. pivot 一般状态下,数据在DataFrame会以压缩(stacked)状态存放,例如上面的Gender,两个类别被叠在一列中, ...
- pandas学习笔记:pandas.Dataframe.rename()函数用法
pandas学习笔记:pandas.Dataframe.rename()函数用法 pandas.Dataframe.rename()函数主要是用来修改Dataframe数据的行名和列名. 主要用到的参 ...
- Pandas学习笔记(一)
Pandas学习笔记一 Pandas数组读取 读取csv.tsv.txt文件 读取excel文件 读取mysql数据表 Pandas数据结构 创建Series的几种方法 根据标签查询Series数据 ...
- pandas学习笔记之DateFrame
pandas学习笔记之DateFrame 文章目录 pandas学习笔记之DateFrame 1.DateFrame的创建 1)认识DataFrame对象 2)由二维列表创建(默认index和colu ...
- 数据分析之pandas学习笔记(六)(层次化索引、重塑、轴向旋转、行列变换、合并表数据)
数据分析之Pandas学习笔记(六)(层次化索引.重塑.轴向旋转.行列变换.合并表数据) level层次化索引 unstack()与stack()进行重塑,即:行列索引变换 swaplevel()交换 ...
- [Pandas 学习笔记] - No.1 pandas学习笔记
pandas学习笔记 pandas是基于numpy开发出的数据分析包,用于高效地操作大型数据集.pandas的数据结构有三种 分别为 series,dataframe和panel,对应一维,二维,三维 ...
- pandas学习笔记之Series
pandas学习笔记之Series 文章目录 pandas学习笔记之Series pandas中Series的创建 1)用python中的列表list创建: 2)用numpy数组创建 3)用pytho ...
- pandas学习笔记(三):数据的变换与数据的管理
注:学习笔记基于文彤老师的pandas的系列课程 课程链接:https://study.163.com/course/courseMain.htm?courseId=1005124008&sh ...
- Pandas 学习笔记一
文章目录 Pandas 学习 核心数据结构 DataFrame 属性 Panel Series 基本数据操作 运算 Pandas 学习 核心数据结构 DataFrame import numpy as ...
- pandas 每一列相加_Python3 numpy amp; pandas 学习笔记
写在前面 在用python做一些ML和DL的工作前,先看莫烦大佬的视频学习一下numpy和pandas这两个数据处理包,学习中记了一些笔记,便于自己日后查阅,同时发布到知乎希望能够帮助到其他小伙伴! ...
最新文章
- Attribute在.net编程中的应用
- 抛弃Anchor box和NMS,目标检测新范式开源:Sparse R-CNN
- python maketrans_Python maketrans()方法 - Python 教程 - 自强学堂
- SparkContext源码分析
- java 文本查找_Java基于正则表达式实现查找匹配的文本功能【经典实例】
- 非常好的C语言章节习题集带答案,非常好的C语言章节习题集带答案选编.doc
- 经典面试题|ConcurrentHashMap 读操作为什么不需要加锁?
- 谁说烟草公司做不好数字化转型!通过BI工具,一年节约成本79万
- 感恩节活动促销海报模板,摆好借势感恩节的姿势
- 耶鲁大学公开课:哲学-死亡
- 青年会会训的一些探究
- 常用服务的默认端口号总结
- IDEA引MAVEN项目jar包依赖导入问题解决
- 深度学习_pytorch_深度学习中的tensor介绍及常用操作
- mac 建 android 签名,mac android app 签名工具
- 易基因|一文读懂:八大RNA m6A甲基化研究核心问题
- 详细解析STM32的时钟系统
- Python 01--介绍、基本语法、流程控制
- php的qq邮箱正则表达式语法_正则表达式综合应用:qq邮箱提取
- 由access key泄露浅谈云安全
热门文章
- 苹果待处理订单要多久_一个订单管理系统帮你轻松应对复杂的生产订单管理
- 流程图制作: BPMN流程图在线绘制
- cpufreq 代码分析
- are in unnamed module of loader ‘app‘)“ }
- 一个bug改了3个礼拜
- HTML和css页眉制作,静态网页制作(Dreamweaver) 设计和制作网站首页 0203-静态网页制作(Dreamweaver)-设计制作网站首页页眉、导航栏.doc...
- 积分墙、广告等违规应用如何在安卓市场上线
- R语言使用oneway.test函数执行单因素方差分析(One-Way ANOVA)、使用aov函数执行单因素方差分析(aov函数默认组间方差相同)
- 一周热图|杨紫韩国艺匠婚纱大片出炉;易烊千玺代言麦当劳;洛天依音乐综艺节目首秀...
- AWZ爱伪装常用问题汇总