# 1 长宽表变形

# 01 长表变宽表pivot

# 02 不满足唯一条件,用pivot_table聚合

# 03 宽表变长表 melt

# 04 交叉类别 wide_to_long

# 2 索引的变形

# 01 unstack行→列 stack列→行

# 3 其他变形函数

# 01 crosstab

# 02 explode 对列元素纵向展开 索引不变

# 03 get_dummies 特征构建 类别特征→指示变量

# -*- coding: utf-8 -*-
"""
Created on Sat Sep  3 10:08:43 2022@author: lenovo
"""import pandas as pd
import numpy as np# 1 长宽表变形
# 长表:把性别存储在某一列中,就是关于性别的长表
pd.DataFrame({'Gender':['F','F','M','M'],'Height':[163,160,175,180]})
# 宽表:把性别作为列名,列中元素是某一其他的相关特征数值,就是关于性别的宽表
pd.DataFrame({'Height:F':[163,160],'Height:M':[175,180]})
# 01 长表变宽表pivot
# index 变形后的索引,columns 需要转到列索引的列,values 对应的数值
# index和columns对应两个列的行组合必须唯一
df = pd.DataFrame({'Class':[1,1,2,2],'Name':['LQ','LQ','YY','YY'],'Subject':['Chinese','Math','Chinese','Math'],'Grade':[80,75,90,85]})df.pivot(index='Name', columns='Subject', values='Grade')df = pd.DataFrame({'Class':[1,1,2,2,1,1,2,2],'Name':['LQ','LQ','YY','YY','LQ','LQ','YY','YY'],'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'])# 02 不满足唯一条件,用pivot_table聚合
df = pd.DataFrame({'Name':['LQ','LQ','LQ','LQ','YY','YY','YY','YY'],'Subject':['chinese','chinese','math','math','chinese','chinese','math','math'],'Grade':[80,75,85,65,90,85,92,88]})
df.pivot_table(index='Name',columns='Subject',values='Grade',aggfunc='mean')
df.pivot_table(index='Name',columns='Subject',values='Grade',aggfunc=lambda x:x.mean())
df.pivot_table(index='Name',columns='Subject',values='Grade',aggfunc='mean',margins=True) # 边际汇总,聚合方式为aggfunc# 03 宽表变长表 melt
df = pd.DataFrame({'Class':[1,2],'Name':['LQ','YY'],'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_unmelted = df_melted.pivot(index=['Class','Name'],columns='Subject',values='Grade')
df_unmelted = df_unmelted.reset_index().rename_axis(columns={'Subject':''})
df_unmelted.equals(df)# 04 交叉类别 wide_to_long
df = pd.DataFrame({'Class':[1,2],'Name':['LQ','YY'],'Chinese_mid':[80,75],'Math_mid':[90,85],'Chinese_mid':[80,75],'Math_mid':[90,85]})
pd.wide_to_long(df, stubnames=['Chinese','Math'], # 连字符前面的内容,成为新表数值列的列名i=['Class','Name'], # 行索引j='Examination', # 对连字符后面的内容重新命名,使之成为次级行索引sep='_',suffix='.+') # 正则后缀?res = pivot_multi.copy()
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)# 2 索引的变形
# 01 unstack行→列 stack列→行
# unstack 行索引转换为列索引
# 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() # 默认转化最内层,移动到列索引的最内层
df.unstack([0,2])
# stack 将列索引压入行索引
df = pd.DataFrame(np.ones((4,2)),index=pd.Index([('A','cat','big'),('A','dog','small'),('B','cat','big'),('B','dog','small')]),columns=['index_1','index_2']).T
df.stack()
df.stack([1,2])# 变形不会改变values个数,只是呈现形式发生改变;分组聚合改变values个数# 3 其他变形函数
# 01 crosstab
# 不推荐使用 pivot_table速度更快
path = r'C:\Users\lenovo\Desktop\最近要用\pandas\joyful-pandas\data'
df = pd.read_csv('{}/learn_pandas.csv'.format(path))
pd.crosstab(index=df.School, columns=df.Transfer)
pd.crosstab(index=df.School, columns=df.Transfer,values=[1]*df.shape[0], aggfunc='count')
df.pivot_table(index='School',columns='Transfer',values='Name',aggfunc='count')
# 以上三个结果一样,但pd.crosstab传入具体的序列,df.pivot_table传入列名
pd.crosstab(index=df.School, columns=df.Transfer,values=df.Height, aggfunc='mean')# 02 explode 对列元素纵向展开 索引不变
df_ex = pd.DataFrame({'A':[[1,2],'str',{1,2},pd.Series([3,4])],'B':1})
df_ex.shape
df_ex.iloc[3,1]
df_ex.explode('A')# 03 get_dummies 特征构建 类别特征→指示变量
pd.get_dummies(df.Grade).head()# Ex1 美国非法药物数据集
df = pd.read_csv('{}/drugs.csv'.format(path)).sort_values(['State','COUNTY','SubstanceName'],ignore_index=True)
df.head(6)
# 1.
df1 = df.pivot(index=['State','COUNTY','SubstanceName'], columns='YYYY', values='DrugReports').reset_index().rename_axis(columns={'YYYY':''})
# 2.
df2 = df1.melt(id_vars=['State','COUNTY','SubstanceName'],value_vars=[2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017],var_name='YYYY',value_name='DrugReports').dropna(subset='DrugReports')
# value_vars=df1.columns[-8:]
df3 = df2[df.columns].sort_values(['State','COUNTY','SubstanceName'],ignore_index=True) # 重置索引为0123...
df4 = df3.astype({'YYYY':'int64','DrugReports':'int64'})
df4.equals(df)
#dropna(axis = 0, how = ‘any’, thresh = None, subset = None, inplace = False)
#axis 默认为零,当某行出现缺失值时,将行删除。
#how = ‘any’,只要有缺失值就丢弃该行/列;how = ‘all’,全部为缺失值才丢弃该行/列。
#thresh 当行列中非缺失值少于给定值时,丢弃该行/列。
#subset 丢弃子列中含有缺失值的行/列。
#inplace 默认False,为True时对原数据操作。
#对于Series,dropna返回一个仅含索引值和非空数据的Series,索引值仍保留删除之前的值。
# 3.1
df.pivot_table(index='YYYY',columns='State',values='DrugReports',aggfunc='sum')
gb = df.groupby(['YYYY','State'])['DrugReports'].sum()
gb.unstack(1)
# res = df.groupby(['State', 'YYYY'])['DrugReports'].sum(1).to_frame().unstack(0).droplevel(0,axis=1)# Ex2 特殊的 wide_to_long 方法
# 从功能上看,melt()方法应当属于wide_to_long()的一种特殊情况,即stubnames只有一类。
# 请使用wide_to_long()生成melt()一节中的df_melted。(提示:对列名增加适当的前缀)
df = pd.DataFrame({'Class':[1,2],'Name':['LQ','YY'],'Chinese':[80,90],'Math':[80,75]})
df_melted = df.melt(id_vars=['Class','Name'],value_vars=['Chinese','Math'],var_name='Subject',value_name='Grade')
df1 = df.copy()
df1.rename(columns={'Chinese':'Score_Chinese','Math':'Score_Math'},inplace=True)
df2 = pd.wide_to_long(df1, stubnames=['Score'], # 连字符前面的内容,成为新表数值列的列名i=['Class','Name'], # 行索引j='Subject', # 对连字符后面的内容重新命名,使之成为次级行索引sep='_',suffix='.+')
df3 = df2.reset_index()

05 pandas变形相关推荐

  1. pandas -----变形(透视表、melt、stack、unstack),哑变量与因子变化

    目录 导入数据 1. 透视表 1. 1 pivot 1.2. pivot_table 1.3 crosstab(交叉表) 2.其他变形方法 2.1. melt 2.2. 压缩与展开 3.哑变量与因子化 ...

  2. 数据分析之Pandas变形操作总结

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:耿远昊,Datawhale成员,华东师范大学 pandas 是一个 ...

  3. 收藏 | 提高数据处理效率的 Pandas 函数方法

    作者:俊欣 来源:关于数据分析与可视化 前言 大家好,这里是俊欣,今天和大家来分享几个Pandas方法可以有效地帮助我们在数据分析与数据清洗过程当中提高效率,加快工作的进程,希望大家看了之后会有收获. ...

  4. Pandas简明教程

    文章目录 1. Pandas概览 1.1 为什么要用Pandas? 1.2 Pandas的特点 1.3 安装和使用 2. 数据结构 2.1 索引数组Index 2.2 带标签的一维同构数组Series ...

  5. 盘点8个数据分析相关的Python库(实例+代码)

    导读:Python中常会用到一些专门的库,如NumPy.SciPy.Pandas和Matplotlib.数据处理常用到NumPy.SciPy和Pandas,数据分析常用到Pandas和Scikit-L ...

  6. 小白入门机器学习必备:编程语言环境介绍及搭建

    导读:工欲善其事,必先利其器,机器学习也不例外.算法原理理解得再清楚,最终也需要通过编写代码来真正实现功能和解决问题. 本文将介绍当前机器学习主流的编程语言环境,当前机器学习使用最多的编程语言是Pyt ...

  7. 最全攻略:数据分析师必备Python编程基础知识

    导读:本文主要介绍使用Python进行数据分析时必备的编程基础知识,主要涉及Python的基本数据类型.数据结构.程序控制.读写数据等内容. Python编写代码时,是以缩进作为代码块的标识,而不是使 ...

  8. 机器学习入门 01 —— 机器学习概述

    文章目录 系列文章 机器学习概述 1.1.人工智能概述 1 人工智能应用场景 2 人工智能小案例 3 人工智能发展必备三要素 4 人工智能.机器学习和深度学习 5 小结 1.2.人工智能发展历程 1. ...

  9. 06 案例 - 赌球神器

    理论部分先告一段落,如果还有不清晰的地方可以选择留言或我私下沟通.今天起正式进入代码阶段,入门项目是赌球神器. 一.建模步骤 1.清洗数据集 . 2.划分训练集和测试集:12个特征:1个目标 - 获胜 ...

  10. joyful pandas 05 变形

    练习 Ex1:美国非法药物数据集 现有一份关于美国非法药物的数据集,其中SubstanceName, DrugReports分别指药物名称和报告数量: import pandas as pd df = ...

最新文章

  1. 一个分析“文件夹”选择框实现方法的过程
  2. 总结:实例化SqlParameter时,如果是字符型,一定要指定size属性,还有制定具体的类型...
  3. sharepoint2013用户切换实现方式
  4. Androidz之Activity概要学习
  5. python heap_python topN max heap,使用heapq还是自己实现?
  6. 无限极分类不知pid_PHP实现无限极分类
  7. Python error: Unable to find vcvarsall.bat
  8. React开发(132):ant design学习指南之form中控制展开和关闭逻辑
  9. 使用ERStudio创建数据表与ER图
  10. JetbrainsCrack-3.1-release-enc.jar 下载
  11. hive和hadoop版本对应关系
  12. STM32学习笔记一:开发环境
  13. 十二、项目收尾(华为项目管理法-孙科炎读书摘要)
  14. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别
  15. # Alpha冲刺之事后诸葛亮
  16. 计算单目标跟踪器的平均CLE
  17. Unity3D 实现背包系统
  18. python爬取古诗文网站诗文一栏的所有诗词
  19. 不懂优雅停机,搞挂了线上服务,咋办?
  20. 2020.1.13 C语言学习 结构体+结构体数组+结构体指针

热门文章

  1. 数据可视化有哪些展现形式
  2. Dell服务器管理工具Dell OpenManager Server Administrator的安装
  3. 【渝粤教育】电大中专跨境电子商务理论与实务 (5)作业 题库
  4. 解锁前端密码框常见功能做法
  5. 诺,你们要的Python进阶来咯!我还没见过比这全面的!
  6. 数据库专辑--SQL分类汇总(group by...with rollup),增加“总计”字段
  7. 量化研究-恐慌和贪婪指数
  8. android 限制后台进程,Android O Preview 相关-后台执行限制
  9. 六个计算机函数,excel统计函数都有哪些?Excel常见6个统计函数
  10. Windows11常用快捷键总结(包含触控板使用技巧)