pandas学习(创建多层索引、数据重塑与轴向旋转)
pandas学习(创建多层索引、数据重塑与轴向旋转)
目录
- 创建多层索引
- 数据重塑与轴向旋转
创建多层索引
隐式构造
Series
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组,Series也可以创建多层索引。
- s = Series(np.random.randint(0,150,size=6),index=[['a','a','b','b','c','c'],['期中','期末','期中','期末','期中','期末']])
- # 输出
- a 期中 59
- 期末 43
- b 期中 28
- 期末 99
- c 期中 92
- 期末 58
- dtype: int32
DataFrame
- df1 = DataFrame(np.random.randint(0,150,size=(4,6)),
- index = list('东南西北'),
- columns=[['python','python','math','math','En','En'],['期中','期末','期中','期末','期中','期末']])
- python math En
- 期中 期末 期中 期末 期中 期末
- 东 137 119 22 3 130 79
- 南 90 146 60 80 143 23
- 西 105 31 125 87 7 66
- 北 131 62 13 67 81 3
显示构造pd.MultiIndex
使用数组构造
- df2 = DataFrame(np.random.randint(0,150,size=(4,6)),
- index = list('东南西北'),
- columns=[['python','python','math','math','En','En'],['期中','期末','期中','期末','期中','期末']])
- python math En
- 期中 期末 期中 期末 期中 期末
- 东 99 10 148 9 146 104
- 南 65 75 7 1 74 107
- 西 136 45 83 121 61 12
- 北 143 131 85 27 55 47
使用tuple构造
- df3 = DataFrame(np.random.randint(0,150,size=(4,6)),
- index = list('东南西北'),
- columns =pd.MultiIndex.from_tuples([('python','期中'),('python','期末'),
- ('math','期中'),('math','期末'),
- ('En','期中'),('En','期末')]))
- python math En
- 期中 期末 期中 期末 期中 期末
- 东 4 76 53 117 62 29
- 南 124 28 61 13 62 117
- 西 87 137 64 125 44 76
- 北 82 120 75 126 78 101
使用product构造(推荐)
- df4 = DataFrame(np.random.randint(0,150,size=(8,12)),
- columns = pd.MultiIndex.from_product([['模拟考','正式考'],
- ['数学','语文','英语','物理','化学','生物']]),
- index = pd.MultiIndex.from_product([['期中','期末'],
- ['雷军','李斌'],
- ['测试一','测试二']]))
- 模拟考 正式考
- 数学 语文 英语 物理 化学 生物 数学 语文 英语 物理 化学 生物
- 期中 雷军 测试一 18 74 113 13 15 73 80 122 80 45 38 103
- 测试二 107 21 7 110 50 32 94 61 78 107 29 17
- 李斌 测试一 62 73 41 8 111 89 100 27 70 58 78 9
- 测试二 142 57 22 103 121 117 134 76 122 112 147 129
- 期末 雷军 测试一 129 26 144 106 63 130 23 68 64 92 126 86
- 测试二 135 84 137 44 121 64 133 56 70 116 147 96
- 李斌 测试一 56 141 40 20 83 84 133 144 105 100 129 52
- 测试二 73 3 114 103 105 41 85 39 30 112 94 64
数据重塑与轴向旋转
数据重塑
层次化索引:层次化索引pandas的一项重要功能,它能使我们在一个轴上拥有多个索引
Series的层次化索引
- import numpy as np
import pandas as pd- s=pd.Series(np.arange(1,10),index=[['a','a','a','b','b','b','c','c','c'],['1','2','3','1','2','3','1','2','3']])
- print(s)
- print(s.index)
- #取值(外层索引)
- print(s['a'])
- print(s['a':'c'])
- #取值(内层索引 )
- print(s[:,'1'])
- #取值(具体值)
- print(s['a','1'])
- #通过unstack方法可以将Series变成一个DataFrame
- s=s.unstack()
- print(s)
- #通过 stack方法可以将stack方法将DataFrame变成Series
- s=s.stack()
- print(s)
- #原始数据
a 1 1- 2 2
- 3 3
- b 1 4
- 2 5
- 3 6
- c 1 7
- 2 8
- 3 9
- dtype: int32
- #索引
- MultiIndex(levels=[['a', 'b', 'c'], ['1', '2', '3']],
- labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]])
- #s['a'],通过外层索引取值
- 1 1
- 2 2
- 3 3
- dtype: int32
- #s['a':'c'],切片
- a 1 1
- 2 2
- 3 3
- b 1 4
- 2 5
- 3 6
- c 1 7
- 2 8
- 3 9
- dtype: int32
- #s[:,'1'],内层索引取值
- a 1
- b 4
- c 7
- dtype: int32
- #s['a','1'],取具体值
- 1
- #通过unstack方法将Series转为DataFrame
- 1 2 3
- a 1 2 3
- b 4 5 6
- c 7 8 9
- #通过stack方法将DataFrame转为Series
- a 1 1
- 2 2
- 3 3
- b 1 4
- 2 5
- 3 6
- c 1 7
- 2 8
- 3 9
- dtype: int32
DataFrame的层次化索引
- #对于 DataFrame来说,行和列都能进行层次化索引,这就是说,可以有四个索引
- #set_index可以把列变成索引
- #reset_index是把索引变成列
- #每一个索引都是一个元组
- import numpy as np
import pandas as pd
data=pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]],columns=[['A','A','B'],['Z','X','C']])
print('原始数据:')
print(data)- #取值
# (1) 可以直接使用列名称来进行列索引
# (2) 使用行索引需要用ix(),loc()等函数
# 推荐使用loc()函数
#确定一个值需要四个索引- #取列
print('取列')
print(data['A','Z'])- #取行
print('取行')
print(data.loc['a',1])- #取某个值
print('取值')
print(data.loc['a',1]['A','Z'])
- 原始数据:
- A B
- Z X C
- a 1 0 1 2
- 2 3 4 5
- b 1 6 7 8
- 2 9 10 11
- 取列
- a 1 0
- 2 3
- b 1 6
- 2 9
- Name: (A, Z), dtype: int32
- 取行
- A Z 0
- X 1
- B C 2
- Name: (a, 1), dtype: int32
- 取值
- 0
- # set_index是把列变成索引
# reset_index是把索引变成列
# 这样做会大大简化我们的筛选环节- import numpy as np
import pandas as pd
# 读入数据
df=pd.read_csv('data1.txt')
print('原始数据')
print(df)- print('设置列为索引')
df=df.set_index(['产地','名字'])
print(df)- #每一个索引都是一个元组
print('返回索引的格式')
print(df.index[0])- #获得某一行数据,数据以内层索引为序列
print('获得某一行数据')
print(df.loc['美国'])- #对调内外层索引
print('对调内外层索引')
df=df.swaplevel('产地','名字')
print(df)- #取消层次化索引
print('取消层次化索引')
df=df.reset_index()
print(df)
- 原始数据
- 名字 投票人数 类型 产地 上映时间 时长 年代 评分
- 0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
- 1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
- 2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
- 3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
- 4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993-01-01 171 1993 9.4
- 设置列为索引
- 投票人数 类型 上映时间 时长 年代 评分
- 产地 名字
- 意大利 美丽人生 42995 剧情/喜剧/爱情 1997-12-20 116 1997 9.5
- 美国 阿甘正传 580897 剧情/爱情 1994-06-23 142 1994 9.4
- 肖申克的救赎 692795 剧情/犯罪 1994-09-10 142 1994 9.6
- 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5
- 中国大陆 霸王别姬 478523 剧情/爱情/同性 1993-01-01 171 1993 9.4
- 返回索引的格式
- ('意大利', '美丽人生')
- 获得某一行数据
- 投票人数 类型 上映时间 时长 年代 评分
- 名字
- 阿甘正传 580897 剧情/爱情 1994-06-23 142 1994 9.4
- 肖申克的救赎 692795 剧情/犯罪 1994-09-10 142 1994 9.6
- 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5
- 对调内外层索引
- 投票人数 类型 上映时间 时长 年代 评分
- 名字 产地
- 美丽人生 意大利 42995 剧情/喜剧/爱情 1997-12-20 116 1997 9.5
- 阿甘正传 美国 580897 剧情/爱情 1994-06-23 142 1994 9.4
- 肖申克的救赎 美国 692795 剧情/犯罪 1994-09-10 142 1994 9.6
- 控方证人 美国 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5
- 霸王别姬 中国大陆 478523 剧情/爱情/同性 1993-01-01 171 1993 9.4
- 取消层次化索引
- 名字 产地 投票人数 类型 上映时间 时长 年代 评分
- 0 美丽人生 意大利 42995 剧情/喜剧/爱情 1997-12-20 116 1997 9.5
- 1 阿甘正传 美国 580897 剧情/爱情 1994-06-23 142 1994 9.4
- 2 肖申克的救赎 美国 692795 剧情/犯罪 1994-09-10 142 1994 9.6
- 3 控方证人 美国 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5
- 4 霸王别姬 中国大陆 478523 剧情/爱情/同性 1993-01-01 171 1993 9.4
轴向旋转
- import numpy as np
import pandas as pd
# 读入数据
df=pd.read_csv('data1.txt')
print('原始数据')
print(df)
- #数据旋转
- #
- # 行和列转化
- # .T可以直接让数据的行和列进行交换
- print('进行行和列的转换')
print(df.T)- #DataFrame也可以使用stack和unstack,转化为层次化索引的Series
print('DataFrame---->Series')
df=df.stack()
print(df)- print('Series--->DataDrame')
df=df.unstack()
print(df)
- 原始数据
- 名字 投票人数 类型 产地 上映时间 时长 年代 评分
- 0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
- 1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
- 2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
- 3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
- 4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993-01-01 171 1993 9.4
- 进行行和列的转换
- 0 1 2 3 4
- 名字 美丽人生 阿甘正传 肖申克的救赎 控方证人 霸王别姬
- 投票人数 42995 580897 692795 42995 478523
- 类型 剧情/喜剧/爱情 剧情/爱情 剧情/犯罪 剧情/悬疑/犯罪 剧情/爱情/同性
- 产地 意大利 美国 美国 美国 中国大陆
- 上映时间 1997-12-20 1994-06-23 1994-09-10 1957-12-17 1993-01-01
- 时长 116 142 142 116 171
- 年代 1997 1994 1994 1957 1993
- 评分 9.5 9.4 9.6 9.5 9.4
- DataFrame---->Series
- 0 名字 美丽人生
- 投票人数 42995
- 类型 剧情/喜剧/爱情
- 产地 意大利
- 上映时间 1997-12-20
- 时长 116
- 年代 1997
- 评分 9.5
- 1 名字 阿甘正传
- 投票人数 580897
- 类型 剧情/爱情
- 产地 美国
- 上映时间 1994-06-23
- 时长 142
- 年代 1994
- 评分 9.4
- 2 名字 肖申克的救赎
- 投票人数 692795
- 类型 剧情/犯罪
- 产地 美国
- 上映时间 1994-09-10
- 时长 142
- 年代 1994
- 评分 9.6
- 3 名字 控方证人
- 投票人数 42995
- 类型 剧情/悬疑/犯罪
- 产地 美国
- 上映时间 1957-12-17
- 时长 116
- 年代 1957
- 评分 9.5
- 4 名字 霸王别姬
- 投票人数 478523
- 类型 剧情/爱情/同性
- 产地 中国大陆
- 上映时间 1993-01-01
- 时长 171
- 年代 1993
- 评分 9.4
- dtype: object
- Series--->DataDrame
- 名字 投票人数 类型 产地 上映时间 时长 年代 评分
- 0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
- 1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
- 2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
- 3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
- 4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993-01-01 171 1993 9.4
pandas学习(创建多层索引、数据重塑与轴向旋转)的更多相关文章
- 8 pandas模块,多层索引
1 创建多层索引 1)隐式构造 最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组 · Series也可以创建多层索引 ...
- pandas学习(四)--数据的归一化
欢迎加入python学习交流群 667279387 Pandas学习(一)–数据的导入 pandas学习(二)–双色球数据分析 pandas学习(三)–NAB球员薪资分析 pandas学习(四)–数据 ...
- Pandas学习(一)——数据的导入
欢迎加入python学习交流群 667279387 学习笔记汇总 Pandas学习(一)–数据的导入 pandas学习(二)–双色球数据分析 pandas学习(三)–NAB球员薪资分析 pandas学 ...
- Pandas重塑和轴向旋转
重塑和轴向旋转 Se import pandas as pd import numpy as np from pandas import Series data=pd.DataFrame(np.ara ...
- javascript学习-创建json对象数据,遍历
之前我已经有讲过后台返回json数据到前台,并在前台遍历json数据. 这里讲下直接在JS里创建JSON数据,然后遍历使用~ 创建代码例如以下:(创建的是JSON对象) var YearSelect ...
- mongodb学习-创建唯一索引(在已存在的集合创建)
如果在已存在的集合创建,可能会存在相同的值如下: 我们可以使用(2.x版本) db.users.ensureIndex({uid:1, name:1}, {unique:true, dropDups: ...
- pandas(八)重塑和轴向旋转
重塑层次化索引 层次化索引为DataFrame的重排提供了良好的一致性操作,主要方法有 stack :将数据的列旋转为行 unstack:将数据的行转换为列 用一个dataframe对象举例 In [ ...
- python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)
//2019.07.19/20 python中pandas数据分析基础(数据重塑与轴向转化.数据分组与分组运算.离散化处理.多数据文件合并操作) 3.1 数据重塑与轴向转换1.层次化索引使得一个轴上拥 ...
- pandas:多层索引
多层索引是指在行或者列轴上有两个及以上级别的索引,一般表示一个数据的几个分项. 1.创建多层索引 1.1通过分组产生多层索引 1.2由序列创建 1.3由元组创建 1.4可迭代对象的笛卡尔积 1.5将D ...
随机推荐
- mongodb系列~关于双活状态的mongodb集群
一简介:说说我们异地双活的集群 二 背景:需要建立异地双活的架构 三 构建 1 需要保证第二机房至少两个副本集DB,这样在第一机房挂掉后才能保证第二机房的可用性 2 集群状态下第二机房启用config ...
- PP图和QQ图
一. QQ图 分位数图示法(Quantile Quantile Plot,简称 Q-Q 图) 统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们 ...
- mac 报错Root chmod operation not permitted on file
系统:mac os 10.14.1 重启电脑 mac用户在升级系统之后,电脑启用了SIP(System Integrity Protection),增加了rootless机制,导致即使在root权限下 ...
- springboot系列十一、redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较
一.redisTemplate和stringRedisTemplate对比 RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出 ...
- dubbo 一个接口多个实现
<dubbo:service ref="dubboGroupService1" interface="com.yncp.dubbo.service.IDubboGr ...
- Android手势滑动Tab
Android手势滑动Tab //MainActivity.java public class MainActivity extends TabActivity { ; ; ; private Ges ...
- vue系列之核心思想
1.数据驱动 只要改变数据,Vuejs会通过Directives指令对DOM进行封装,当数据发生变化,会通知相应的DOM进行变化 Vuejs会对DOM进行监听,通过DOMListeners监听视图的变 ...
- python调用修改变量新方法
def foo(): count = [1] #将变量放在列表中,此时,内部函数就可以修改了 def bar(): count[0] = count[0] + 1 return count[0] re ...
- python 全栈开发,Day43(python全栈11期月考题)
python全栈11期月考题 1.常用字符串格式化有哪些?并说明他们的区别 2.请手写一个单例模式(面试题) 3.利用 python 打印前一天的本地时间,格式为‘2018-01-30’(面试题) 4 ...
- 步步为营-55-js练习
1:加法计算器 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...