pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的。

本章节的代码引入pandas约定为:import pandas as pd,另外import numpy as np也会用到。

官方介绍:pandas - Python Data Analysis Library (pydata.org)

8 层次化索引

层次化索引使你能在一个轴上拥有多个(两个以上)索引级别。抽象的说,它使你能以低维度形式处理高维度数据。

 1 >>> data = pd.Series(np.random.randn(10), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'], [1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
2 >>> data
3 a 1 3.230188
4 2 0.596511
5 3 0.956307
6 b 1 1.132221
7 2 0.746174
8 3 0.470007
9 c 1 0.880883
10 2 0.757047
11 d 2 -0.028331
12 3 0.382625
13 dtype: float64
14 >>> data.index #带MultiIndex索引的Series的格式化输出形式,索引之间的“间隔”表示“直接使用上面的标签”
15 MultiIndex([('a', 1),
16 ('a', 2),
17 ('a', 3),
18 ('b', 1),
19 ('b', 2),
20 ('b', 3),
21 ('c', 1),
22 ('c', 2),
23 ('d', 2),
24 ('d', 3)],
25 )
26 >>> data['b'] #选取数据子集
27 1 1.132221
28 2 0.746174
29 3 0.470007
30 dtype: float64
31 >>> data['b': 'c']
32 b 1 1.132221
33 2 0.746174
34 3 0.470007
35 c 1 0.880883
36 2 0.757047
37 dtype: float64
38 >>> data.loc[['b', 'd']]
39 b 1 1.132221
40 2 0.746174
41 3 0.470007
42 d 2 -0.028331
43 3 0.382625
44 dtype: float64
45 >>> data[:, 2] #在“内层”中进行选取
46 a 0.596511
47 b 0.746174
48 c 0.757047
49 d -0.028331
50 dtype: float64

层次索引在数据重塑和基于和基于分组的操作(如透视表生成)中有重要作用。

如可以通过unstack方法重新安排多层数据到一个DataFrame中。

官方说明:pandas.DataFrame.unstack — pandas 1.3.4 documentation (pydata.org)

 1 >>> data
2 a 1 3.230188
3 2 0.596511
4 3 0.956307
5 b 1 1.132221
6 2 0.746174
7 3 0.470007
8 c 1 0.880883
9 2 0.757047
10 d 2 -0.028331
11 3 0.382625
12 dtype: float64
13 >>> data.unstack()
14 1 2 3
15 a 3.230188 0.596511 0.956307
16 b 1.132221 0.746174 0.470007
17 c 0.880883 0.757047 NaN
18 d NaN -0.028331 0.382625
19 >>> data.unstack().stack() #stack使unstack的逆运算
20 a 1 3.230188
21 2 0.596511
22 3 0.956307
23 b 1 1.132221
24 2 0.746174
25 3 0.470007
26 c 1 0.880883
27 2 0.757047
28 d 2 -0.028331
29 3 0.382625
30 dtype: float64

对于一个DataFrame,每条轴都可以分成索引,每层都可以由名字(可能是字符串,也可以是别的python对象)。如果指定了名字,它们就会显示在控制台输出中。

 1 >>> frame = pd.DataFrame(np.arange(12).reshape((4, 3)), index=[['a', 'a', 'b', 'b'], [1, 2, 1, -2]], columns=[['Oh', 'Oh', 'Co'], ['Gr', 'Re', 'Gr']])
3 >>> frame
4 Oh Co
5 Gr Re Gr
6 a 1 0 1 2
7 2 3 4 5
8 b 1 6 7 8
9 -2 9 10 11
10 >>> frame.index.names = ['key1', 'key2']
11 >>> frame.columns.names = ['state', 'color']
12 >>> frame
13 state Oh Co
14 color Gr Re Gr
15 key1 key2
16 a 1 0 1 2
17 2 3 4 5
18 b 1 6 7 8
19 -2 9 10 11
20 >>> frame['Oh']
21 color Gr Re
22 key1 key2
23 a 1 0 1
24 2 3 4
25 b 1 6 7
26 -2 9 10

8.1 重排分级排序

有时需要调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。

swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(当数据不会发生变化)。

官方文档:pandas.DataFrame.swaplevel — pandas 1.3.4 documentation (pydata.org)

 1 >>> frame
2 state Oh Co
3 color Gr Re Gr
4 key1 key2
5 a 1 0 1 2
6 2 3 4 5
7 b 1 6 7 8
8 -2 9 10 11
9 >>> frame.swaplevel('key1', 'key2')
10 state Oh Co
11 color Gr Re Gr
12 key2 key1
13 1 a 0 1 2
14 2 a 3 4 5
15 1 b 6 7 8
16 -2 b 9 10 11

8.2 根据级别汇总统计

许多对DataFrame和Series的描述和汇总统计都有一个level选项,用于指定在某条轴上求和的级别。

 1 >>> frame
2 state Oh Co
3 color Gr Re Gr
4 key1 key2
5 a 1 0 1 2
6 2 3 4 5
7 b 1 6 7 8
8 -2 9 10 11
9 >>> frame.sum(level='key2')
10 state Oh Co
11 color Gr Re Gr
12 key2
13 1 6 8 10
14 2 3 4 5
15 -2 9 10 11
16 >>> frame.sum(level='color', axis=1)
17 color Gr Re
18 key1 key2
19 a 1 2 1
20 2 8 4
21 b 1 14 7
22 -2 20 10
23 >>>

8.3 使用DataFrame的列

经常将DataFrame的一个或多个列当作行索引来使用,或者希望将行索引变成DataFrame的列。

DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame。

 1 >>> frame = pd.DataFrame({'a': range(7), 'b': range(7, 0, -1), 'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'], 'd': [0, 1, 2, 0, 1, 2, 3]})
2 >>> frame
3 a b c d
4 0 0 7 one 0
5 1 1 6 one 1
6 2 2 5 one 2
7 3 3 4 two 0
8 4 4 3 two 1
9 5 5 2 two 2
10 6 6 1 two 3
11 >>> frame2 = frame.set_index(['c', 'd'])
12 >>> frame2
13 a b
14 c d
15 one 0 0 7
16 1 1 6
17 2 2 5
18 two 0 3 4
19 1 4 3
20 2 5 2
21 3 6 1
22 >>> frame.set_index(['c', 'd'], drop=False) #可选择保留那些列
23 a b c d
24 c d
25 one 0 0 7 one 0
26 1 1 6 one 1
27 2 2 5 one 2
28 two 0 3 4 two 0
29 1 4 3 two 1
30 2 5 2 two 2
31 3 6 1 two 3

reset_index的功能和set_index刚好相反、层次化索引的级别会被转移到列里面:

 1 >>> frame2
2 a b
3 c d
4 one 0 0 7
5 1 1 6
6 2 2 5
7 two 0 3 4
8 1 4 3
9 2 5 2
10 3 6 1
11 >>> frame2.reset_index()
12 c d a b
13 0 one 0 0 7
14 1 one 1 1 6
15 2 one 2 2 5
16 3 two 0 3 4
17 4 two 1 4 3
18 5 two 2 5 2
19 6 two 3 6 1

pandas基础--层次化索引的更多相关文章

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

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

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

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

  3. pandas基础用法——索引

    # -*- coding: utf-8 -*- # Time : 2016/11/28 15:14 # Author : XiaoDeng # version : python3.5 # Softwa ...

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

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

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

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

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

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

  7. (三)pandas 层次化索引

    pandas层次化索引 1. 创建多层行索引 1) 隐式构造 最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组 Series也可以创建多层索引 import numpy ...

  8. Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识

    第1节 pandas 回顾 第2节 读写文本格式的数据 第3节 使用 HTML 和 Web API 第4节 使用数据库 第5节 合并数据集 第6节 重塑和轴向旋转 第7节 数据转换 第8节 字符串操作 ...

  9. 利用Python进行数据分析(12) pandas基础: 数据合并

    pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...

  10. 利用Python进行数据分析(9) pandas基础: 汇总统计和计算

    pandas 对象拥有一些常用的数学和统计方法.   例如,sum() 方法,进行列小计:   sum() 方法传入 axis=1 指定为横向汇总,即行小计:   idxmax() 获取最大值对应的索 ...

随机推荐

  1. navicat连接mysql8报错

    mysql8采用更安全的加密方式,navicat不支持,网上大多办法都是采用的更改数据库加密方式为外部加密 个人觉得这样它不太合适 so,终于找到一个办法: 把mysql8安装后的lib文件夹里的 l ...

  2. stmp 501 5.1.3 Invalid Address 无效的邮件地址

    stmp 501 5.1.3 Invalid Address 无效的邮件地址 一般来说就是要确认邮箱地址是不是对的 还有一种可能的情况是使用的邮件服务器仅支持对内邮件,没有对外邮件的发送权限

  3. KubeVela 成为 CNCF 沙箱项目,让云端应用交付更加简单

    简介: KubeVela 就是这样一个面向用户的上层平台项目.对于业务开发者来说,KubeVela 简单.易用,它可以让开发者以极低的心智负担和上手成本在 Kubernetes 上定义与部署应用... ...

  4. 基于MaxCompute+PAI的用户增长方案实践

    ​简介: 如何通过PAI+MaxCompute完成用户增长模型AARRR全链路,包含拉新.促活.留存.创收.分享. 本文作者 李博 阿里云智能 高级产品专家 在过去一年阿里云PAI机器学习团队做了很多 ...

  5. [Mobi] Android Studio NDK 安装

    通过 SDK Manager - SDK Tools 中勾选 NDK 进行安装. 注意,下载来源是 dl.google.com,请准备好能连接到国际互联网. 下载完成后在 sdk 工具里面可以看到 n ...

  6. 修复 WPF 安装 WindowsAppSDK 库构建失败 NETSDK1082 和 NETSDK1112 找不到 win10-arm 失败

    通过在 WPF 项目上安装 WindowsAppSDK 库,可以让 WPF 使用上 Win10 及以上版本提供的 Windows Runtime 强大的 API 集和使用上更多的黑科技.本文记录在安装 ...

  7. WPF 从 RGB 字符串转纯色颜色画刷的方法

    本文告诉大家几个方法用来从 RGB 字符串转纯色的 SolidColorBrush 画刷 在 Windows 下,约定的编程规范里,颜色的 RGB 的字符串表示方法是 #[A]RGB 的格式,一定是 ...

  8. dotnet 6 引用 NAudio 的旧版本构建不通过

    本文告诉大家在使用 NAudio 的旧版本导致构建不通过问题,解决方法是升级到 1.10 或以上版本 在更新 dotnet 6 项目时,使用了 NAudio 的旧版本,构建失败,提示 MC1000 如 ...

  9. dotnet 在 UOS 国产系统上安装 dotnet sdk 的方法

    本文告诉大家如何在 UOS 国产系统上安装 dotnet sdk 的方法 使用的 UOS 是 UOS 20 x64 版本,这个系统版本是基于 debian 10 的,可以使用 debian 10 的方 ...

  10. C++ lambda的重载

    先说结论,lambda是不能重载的(至少到c++23依旧如此,以后会怎么样没人知道).而且即使代码完全一样的两个lambda也会有完全不同的类型. 但虽然不能直接实现lambda重载,我们有办法去模拟 ...