(三)pandas 层次化索引
pandas层次化索引
1. 创建多层行索引
1) 隐式构造
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
- Series也可以创建多层索引
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
s = Series(data = [1,2,3,"a"], index = [["a","a","b","b"],["期中","期末","期中","期末"]])
s
a 期中 1
c 期末 2
b 期中 3
d 期末 a
dtype: object
df = DataFrame(data = [1,2,3,"a"],
index = [["a","a","b","b"],["期中","期末","期中","期末"]],columns = ["Python"])
df
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | ||
|---|---|---|
| a | 期中 | 1 |
| 期末 | 2 | |
| b | 期中 | 3 |
| 期末 | a |
#三层索引
df = DataFrame(data = np.random.randint(0,150,size = 8),
index = [["a","a","a","a","b","b","b","b"],
["期中","期中","期末","期末","期中","期中","期末","期末"],
["一单元","二单元","一单元","二单元","一单元","二单元","一单元","二单元"]],
columns = ["Python"])
df
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | |||
|---|---|---|---|
| a | 期中 | 一单元 | 79 |
| 二单元 | 92 | ||
| 期末 | 一单元 | 84 | |
| 二单元 | 93 | ||
| b | 期中 | 一单元 | 10 |
| 二单元 | 129 | ||
| 期末 | 一单元 | 38 | |
| 二单元 | 33 |
2) 显示构造pd.MultiIndex
- 使用数组
df1 = DataFrame(data = np.random.randint(0,150,size = 8),
index = pd.MultiIndex.from_arrays([["a","a","a","a","b","b","b","b"],
["期中","期中","期末","期末","期中","期中","期末","期末"],
["一单元","二单元","一单元","二单元","一单元","二单元","一单元","二单元"]]),
columns = ["Python"])
df1
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | |||
|---|---|---|---|
| a | 期中 | 一单元 | 19 |
| 二单元 | 102 | ||
| 期末 | 一单元 | 56 | |
| 二单元 | 11 | ||
| b | 期中 | 一单元 | 58 |
| 二单元 | 38 | ||
| 期末 | 一单元 | 95 | |
| 二单元 | 26 |
df1.index
MultiIndex(levels=[['a', 'b'], ['期中', '期末'], ['一单元', '二单元']],
labels=[[0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 1, 1], [0, 1, 0, 1, 0, 1, 0, 1]])
df1.columns
Index(['Python'], dtype='object')
#可以把行索引变换成列索引
df2 = DataFrame(data = np.random.randint(0,150,size = (1,8)),
columns = pd.MultiIndex.from_arrays([["a","a","a","a","b","b","b","b"],
["期中","期中","期末","期末","期中","期中","期末","期末"],
["一单元","二单元","一单元","二单元","一单元","二单元","一单元","二单元"]]),
index = ["Python"])
df2
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead tr th {
text-align: left;
}
| a | b | |||||||
|---|---|---|---|---|---|---|---|---|
| 期中 | 期末 | 期中 | 期末 | |||||
| 一单元 | 二单元 | 一单元 | 二单元 | 一单元 | 二单元 | 一单元 | 二单元 | |
| Python | 121 | 143 | 120 | 82 | 105 | 126 | 101 | 59 |
- 使用tuple
df3 = DataFrame(np.random.randint(0,150,size = 4),
index = pd.MultiIndex.from_tuples([("a",1),('a',2),("b",1),("b",2)]),columns = ["Python"])
df3
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | ||
|---|---|---|
| a | 1 | 69 |
| 2 | 132 | |
| b | 1 | 7 |
| 2 | 86 |
使用product
最简单,推荐使用
df4 = DataFrame(np.random.randint(0,150,size = (8,2)),
index = pd.MultiIndex.from_product([list("abcd"), ["期中","期末"]]),
columns = ["Python","高数"])
df4
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | 高数 | ||
|---|---|---|---|
| a | 期中 | 14 | 129 |
| 期末 | 40 | 74 | |
| b | 期中 | 83 | 103 |
| 期末 | 44 | 62 | |
| c | 期中 | 95 | 141 |
| 期末 | 55 | 103 | |
| d | 期中 | 42 | 68 |
| 期末 | 51 | 71 |
============================================
练习8:
- 创建一个DataFrame,表示出张三李四期中期末各科成绩
============================================
df = DataFrame(data = np.random.randint(0,150,size = (4,4)),
index = [["张三","张三","李四","李四"],["期中","期末","期中","期末"]],
columns = ["Python","Html","Java","PHP"])
df
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Html | Java | PHP | ||
|---|---|---|---|---|---|
| 张三 | 期中 | 6 | 96 | 146 | 23 |
| 期末 | 139 | 136 | 84 | 77 | |
| 李四 | 期中 | 145 | 94 | 24 | 110 |
| 期末 | 95 | 16 | 34 | 34 |
2. 多层列索引
除了行索引index,列索引columns也能用同样的方法创建多层索引
#可以把行索引变换成列索引
df2 = DataFrame(data = np.random.randint(0,150,size = (1,8)),
columns = pd.MultiIndex.from_arrays([["a","a","a","a","b","b","b","b"],
["期中","期中","期末","期末","期中","期中","期末","期末"],
["一单元","二单元","一单元","二单元","一单元","二单元","一单元","二单元"]]),
index = ["Python"])
df2
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead tr th {
text-align: left;
}
| a | b | |||||||
|---|---|---|---|---|---|---|---|---|
| 期中 | 期末 | 期中 | 期末 | |||||
| 一单元 | 二单元 | 一单元 | 二单元 | 一单元 | 二单元 | 一单元 | 二单元 | |
| Python | 141 | 82 | 39 | 6 | 16 | 69 | 19 | 22 |
3. 多层索引对象的索引与切片操作
1)Series的操作
【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,因此,推荐使用中括号索引和切片。
(1) 索引
s = Series(data = [1,2,3,"a"], index = [["a","a","b","b"],["期中","期末","期中","期末"]])
s
a 期中 1
期末 2
b 期中 3
期末 a
dtype: object
s["a"]["期末"]
2
s["a","期末"]
2
s["a","jhdsajdasjk"]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-23-768e71c3a49c> in <module>()
----> 1 s["a","jhdsajdasjk"]
C:\anaconda\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
662 key = check_bool_indexer(self.index, key)
663
--> 664 return self._get_with(key)
665
666 def _get_with(self, key):
C:\anaconda\lib\site-packages\pandas\core\series.py in _get_with(self, key)
675 if isinstance(key, tuple):
676 try:
--> 677 return self._get_values_tuple(key)
678 except Exception:
679 if len(key) == 1:
C:\anaconda\lib\site-packages\pandas\core\series.py in _get_values_tuple(self, key)
723
724 # If key is contained, would have returned by now
--> 725 indexer, new_index = self.index.get_loc_level(key)
726 return self._constructor(self._values[indexer],
727 index=new_index).__finalize__(self)
C:\anaconda\lib\site-packages\pandas\core\indexes\multi.py in get_loc_level(self, key, level, drop_level)
2246
2247 return (self._engine.get_loc(
-> 2248 _values_from_object(key)), None)
2249
2250 else:
pandas/_libs/index.pyx in pandas._libs.index.MultiIndexObjectEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.MultiIndexObjectEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: ('a', 'jhdsajdasjk')
s[['a',"期中"]]
#写两个 的时候,只会取第一个,之后就不管了
a 期中 1
期末 2
dtype: object
(2) 切片
s["a":"b"]
a 期中 1
期末 2
b 期中 3
期末 a
dtype: object
s["期中":"期末"]
Series([], dtype: object)
#多层索引,自然数的索引从0开始的,有多少行算多少行,和总体的数据有关!!!
s.iloc[0:3]
a 期中 1
期末 2
b 期中 3
dtype: object
2)DataFrame的操作
(1) 可以直接使用列名称来进行列索引
(2) 使用行索引需要用ix(),loc()等函数
【极其重要】推荐使用loc()函数
注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
df4
#想要a,期中的Python的成绩
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | 高数 | ||
|---|---|---|---|
| a | 期中 | 14 | 129 |
| 期末 | 40 | 74 | |
| b | 期中 | 83 | 103 |
| 期末 | 44 | 62 | |
| c | 期中 | 95 | 141 |
| 期末 | 55 | 103 | |
| d | 期中 | 42 | 68 |
| 期末 | 51 | 71 |
df4["Python"]["a"]["期中"]
14
df4["Python"]["a","期中"]
14
df4.loc['b', "期末"]["Python"]
44
============================================
练习9:
分析比较Series和DataFrame各种索引的方式,熟练掌握.loc()方法
假设张三再一次在期中考试的时候因为特殊原因放弃英语考试,如何实现?
============================================
4. 索引的堆(stack)
stack()unstack()
小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
============================================
练习10:
使用unstack()将ddd变为两行,分别为期中期末
使用unstack()将ddd变为四行,分别为四个科目
============================================
5. 聚合操作
【注意】
需要指定axis
【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。
所谓的聚合操作:平均数,方差,最大值,最小值……
============================================
练习11:
计算各个科目期中期末平均成绩
计算各科目张三李四的最高分
============================================
(三)pandas 层次化索引的更多相关文章
- pandas中层次化索引与切片
Pandas层次化索引 1. 创建多层索引 隐式索引: 常见的方式是给dataframe构造函数的index参数传递两个或是多个数组 Series也可以创建多层索引 Series多层索引 B =Ser ...
- Pandas基本功能之层次化索引及层次化汇总
层次化索引 层次化也就是在一个轴上拥有多个索引级别 Series的层次化索引 data=Series(np.random.randn(10),index=[ ['a','a','a','b','b', ...
- pandas:由列层次化索引延伸的一些思考
1. 删除列层次化索引 用pandas利用df.groupby.agg() 做聚合运算时遇到一个问题:产生了列方向上的两级索引,且需要删除一级索引.具体代码如下: # 每个uesr每天消费金额统计:和 ...
- pandas(五)处理缺失数据和层次化索引
pandas用浮点值Nan表示浮点和非浮点数组中的缺失数据.它只是一个便于被检测的标记而已. >>> string_data = Series(['aardvark','artich ...
- 利用Python进行数据分析(11) pandas基础: 层次化索引
层次化索引 层次化索引指你能在一个数组上拥有多个索引,例如: 有点像Excel里的合并单元格对么? 根据索引选择数据子集 以外层索引的方式选择数据子集: 以内层索引的方式选择数据: 多重索引S ...
- 利用Python进行数据分析_Pandas_层次化索引
申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 层次化索引主要解决低纬度形式处理高纬度数据的问题 import pandas ...
- ElasticSearch入门 第三篇:索引
这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- pandas重置索引的几种方法探究
pandas重置索引的几种方法探究 reset_index() reindex() set_index() 函数名字看起来非常有趣吧! 不仅如此. 需要探究. http://nbviewer.jupy ...
- 关于groupby与层次化索引的联系和层次化标签的使用
groupby出来对象并不是dataFrame,所以直接print是看不到矩阵或者高维矩阵的,所以需要用能够产生标量值的方法去处理groupby对象,这样可以利用矩阵形式处理高维数据: 这样group ...
随机推荐
- ecshop php商城系统数据库结构及表的介绍分析
ecshop共86张表,确实比较多,不过功能确实最完善的. 表结构分析 ecs_account_log // 用户账目日志表 ecs_activity // 活动表(代码,名称,开始,结束,描述) ...
- (一)maven搭建和idea的配置
一.下载安装 前往 https://maven.apache.org/download.cgi 下载最新版的Maven程序.解压到任意目录 (要养成不起中文路径的好习惯,否则有时间出问题真的很难找) ...
- cc40a_demo_Cpp_智能指针c++_txwtech
//40_21days_Cpp_智能指针c++_cc40a_demo.cpp_txwtech //智能指针.auto_ptr类//*常规指针-容易产生内存泄漏,内存被占满,程序就死机,或者系统死机// ...
- WeChair项目Beta冲刺(4/10)
团队项目进行情况 1.昨日进展 Beta冲刺第四天 昨日进展: 前后端并行开发,项目按照计划有条不絮进行 2.今日安排 前端:扫码占座功能和预约功能并行开发 后端:扫码占座后端逻辑和预约功能逻辑 ...
- JAVA设计模式 2【创建型】原型模式的理解与使用
在本节中,我们将学习和使用原型模式:这一节学习的原型模式也是创建型 模式的其中之一.再次复习一下:创建型 模式就是描述如何去更好的创建一个对象. 我们都知道,在JAVA 语言中.使用new 关键字创建 ...
- Java中堆栈的区别
简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...
- JavaWeb网上图书商城完整项目--12.项目所需jquery函数介绍之ajax
jquery中使用ajax发送异步请求 下面的一个案例在input输入框失去焦点的时候发送一个异步的请求: 我们来看程序的案例: 这里要强调的是返回值最好选择是json,json对应的就是对象,Jav ...
- Python 分布式缓存之Reids数据类型操作
目录 1.Redis API 2.String 操作 3.Hash 操作 4.List 操作 1.Redis API 1.操作模式 redis-py提供两个类Redis和StrictRedis用于实现 ...
- Jmeter系列(31)- 获取并使用 JDBC Request 返回的数据
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 Jmeter 使用 JDBC R ...
- Python3-设计模式-装饰器模式
装饰器模式 动态的给原有对象添加一些额外的职责,面向切面编程(AOP),多用于和主业务无关,但又必须的业务,如:登录认证.加锁.权限检查等 Python代码实现示例 需求点: 1.在old_func( ...