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:

  1. 创建一个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:

  1. 分析比较Series和DataFrame各种索引的方式,熟练掌握.loc()方法

  2. 假设张三再一次在期中考试的时候因为特殊原因放弃英语考试,如何实现?

============================================

4. 索引的堆(stack)

  • stack()
  • unstack()

小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。

【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。

============================================

练习10:

  1. 使用unstack()将ddd变为两行,分别为期中期末

  2. 使用unstack()将ddd变为四行,分别为四个科目

============================================

5. 聚合操作

【注意】

  • 需要指定axis

  • 【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。

所谓的聚合操作:平均数,方差,最大值,最小值……


============================================

练习11:

  1. 计算各个科目期中期末平均成绩

  2. 计算各科目张三李四的最高分

============================================

(三)pandas 层次化索引的更多相关文章

  1. pandas中层次化索引与切片

    Pandas层次化索引 1. 创建多层索引 隐式索引: 常见的方式是给dataframe构造函数的index参数传递两个或是多个数组 Series也可以创建多层索引 Series多层索引 B =Ser ...

  2. Pandas基本功能之层次化索引及层次化汇总

    层次化索引 层次化也就是在一个轴上拥有多个索引级别 Series的层次化索引 data=Series(np.random.randn(10),index=[ ['a','a','a','b','b', ...

  3. pandas:由列层次化索引延伸的一些思考

    1. 删除列层次化索引 用pandas利用df.groupby.agg() 做聚合运算时遇到一个问题:产生了列方向上的两级索引,且需要删除一级索引.具体代码如下: # 每个uesr每天消费金额统计:和 ...

  4. pandas(五)处理缺失数据和层次化索引

    pandas用浮点值Nan表示浮点和非浮点数组中的缺失数据.它只是一个便于被检测的标记而已. >>> string_data = Series(['aardvark','artich ...

  5. 利用Python进行数据分析(11) pandas基础: 层次化索引

      层次化索引 层次化索引指你能在一个数组上拥有多个索引,例如: 有点像Excel里的合并单元格对么? 根据索引选择数据子集   以外层索引的方式选择数据子集: 以内层索引的方式选择数据: 多重索引S ...

  6. 利用Python进行数据分析_Pandas_层次化索引

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 层次化索引主要解决低纬度形式处理高纬度数据的问题 import pandas ...

  7. ElasticSearch入门 第三篇:索引

    这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  8. pandas重置索引的几种方法探究

    pandas重置索引的几种方法探究 reset_index() reindex() set_index() 函数名字看起来非常有趣吧! 不仅如此. 需要探究. http://nbviewer.jupy ...

  9. 关于groupby与层次化索引的联系和层次化标签的使用

    groupby出来对象并不是dataFrame,所以直接print是看不到矩阵或者高维矩阵的,所以需要用能够产生标量值的方法去处理groupby对象,这样可以利用矩阵形式处理高维数据: 这样group ...

随机推荐

  1. 给博客使用Butterfly主题并部署到GitHub服务器

    目录 前言 一.安装Butterfly主题 二.将本地博客部署到GitHub服务器 三.将个人域名与GitHub绑定 前言 安装完Hexo框架后,自带的主题在thems文件夹下可以查看,应用后界面: ...

  2. 在VisualStudio中为GUI程序添加console

    1.使用WINDOWS提供的一系列ReadConsole,WriteConsole等API来完成这个功能,具体参见MSDN HANDLE hOut = GetStdHandle(STD_OUTPUT_ ...

  3. nodejs 换源

    解决npm install安装慢的问题国外镜像会很慢 可用 get命令查看registry npm config get registry 原版结果为 http://registry.npmjs.or ...

  4. Android中的SharedPreferences存储

    一.前言 不同于文件的存储方式,SharedPreferences是使用键值对的方式来存储数据的.也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把 ...

  5. 4.kubernetes的服务发现插件-CoreDNS

    1.1.部署K8S内网资源清单http服务 1.2.部署coredns 部署K8S内网资源清单http服务 在运维主机HDSS7-200.host.com上,配置一个nginx虚拟主机,用以提高k8s ...

  6. 为什么用抓包工具看HTTPS包是明文的

    测试或者开发调试的过程中,经常会进行抓包分析,并且装上抓包工具的证书就能抓取 HTTPS 的数据包并显示.由此就产生了一个疑问,为什么抓包工具装上证书后就能抓到 HTTPS 的包并显示呢?不是说 HT ...

  7. NodeJs通过HTTP模块发起GET|POST请求

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] Node.js ...

  8. JavaWeb网上图书商城完整项目--BaseServlet

    1.以前进行操作的时候,例如我们进行登陆操作我们使用LoginServlet进行处理,进行注册操作我们使用RegisterServlet,很多业务的操作的时候我们就要定义很多个Servlet 有了Ba ...

  9. 有return的情况下try_catch_finally的执行顺序

    java异常处理之try_catch_finally 看下面的一个列子: public class TestException { int goabl=1; public TestException( ...

  10. msf stagers开发不完全指北(二)

    采用 Golang 开发stagers 上一篇文章 msf stagers开发不完全指北(一)中我们谈到如何采用 c 进行 msf 的 stagers 开发,这篇文章我们探讨一下如何使用 Golang ...