Pandas进阶之DataFrame多级索引
多级索引:在一个轴上有多个(两个以上)的索引,能够以低维度形式来表示高维度的数据。单级索引是Index对象,多级索引是MultiIndex对象。
一、创建多级索引
- 方法一:隐式创建,即给DataFrame的
index或columns参数传递两个或更多的数组。df1 = pd.DataFrame(np.random.randint(80, 120, size=(2, 4)),
index= ['girl', 'boy'],
columns=[['English', 'English', 'Chinese', 'Chinese'],
['like', 'dislike', 'like', 'dislike']]) print(df1) # 创建多级 列 索引
-------------------------------------------------------------------------------------
English Chinese
like dislike like dislike
girl 85 109 117 110
boy 85 111 100 107
- 方法二、显示创建,推荐使用较简单的
pd.MultiIndex.from_product方法df2 = pd.DataFrame(np.random.randint(80, 120, size=(4, 2)),
columns= ['girl', 'boy'],
index=pd.MultiIndex.from_product([['English','Chinese'],
['like','dislike']]))
print(df2) # 创建多级 行 索引
-------------------------------------------------------------------------------------
girl boy
English like 92 98
dislike 118 99
Chinese like 109 108
dislike 108 91
二、检索多级索引
- 类似单级索引检索(loc、iloc),以
df1数据为例df1.English
-------------------------------------------------------------------------------------
like dislike
girl 105 112
boy 118 87 df1.English.dislike
-------------------------------------------------------------------------------------
girl 112
boy 87
Name: dislike, dtype: int64 df1.iloc[:,0:3]
-------------------------------------------------------------------------------------
English Chinese
like dislike like
girl 85 113 82
boy 97 83 94 df1.loc['girl', ['English', 'Chinese']]
-------------------------------------------------------------------------------------
English like 105
dislike 112
Chinese like 87
dislike 92
Name: girl, dtype: int64
- 多级索引的检索,可以使用更高级的方法,如xs、IndexSlice等,用到较少暂不介绍。
三、更改索引的层级
- 创建多级索引
df = pd.DataFrame(np.random.randint(80, 120, size=(6, 4)),
index= pd.MultiIndex.from_product([[1, 2, 3],['girl', 'boy']]),
columns=pd.MultiIndex.from_product([['English','Chinese'],
['Y','N']]))
print(df)
-------------------------------------------------------------------------------------
English Chinese
Y N Y N
1 girl 86 99 111 105
boy 85 110 113 112
2 girl 98 106 108 94
boy 117 80 97 83
3 girl 95 81 114 95
boy 106 95 119 81
- 为多级索引命名
df.columns.names = ['Language', 'Pass'] # 设置列索引名
df.index.names = ['Class', 'Six'] # 设置行索引名 print(df)
-------------------------------------------------------------------------------------
Language English Chinese
Pass Y N Y N
Class Six
1 girl 86 99 111 105
boy 85 110 113 112
2 girl 98 106 108 94
boy 117 80 97 83
3 girl 95 81 114 95
boy 106 95 119 81
- 更改索引的层级(swaplevel)
df.swaplevel('Six','Class') # 更改行索引的层级
-------------------------------------------------------------------------------------
Language English Chinese
Pass Y N Y N
Six Class
girl 1 86 99 111 105
boy 1 85 110 113 112
girl 2 98 106 108 94
boy 2 117 80 97 83
girl 3 95 81 114 95
boy 3 106 95 119 81
四、多级索引的值排序(sort_index)
- 方法一
df.sort_index(level=0, axis=0, ascending=False) # 对行索引Class的值进行降序排列
-------------------------------------------------------------------------------------
Language English Chinese
Pass Y N Y N
Class Six
3 girl 95 81 114 95
boy 106 95 119 81
2 girl 98 106 108 94
boy 117 80 97 83
1 girl 86 99 111 105
boy 85 110 113 112
- 方法二:使用sortlevel方法,从0.20.0版本开始,已经被弃用
五、多级索引汇总统计
- 示例一
df.sum(level=1) 或df.sum(level='Six') # 对行索引Six进行求和
-------------------------------------------------------------------------------------
Language English Chinese
Pass Y N Y N
Six
girl 279 286 333 294
boy 308 285 329 276
- 示例二
df.sum(level=0, axis=1) 或 df.sum(level='Language', axis=1) # 对列索引Language进行求和
-------------------------------------------------------------------------------------
Language English Chinese
Class Six
1 girl 185 216
boy 195 225
2 girl 204 202
boy 197 180
3 girl 176 209
boy 201 200
六、多级索引轴向转换
常见的数据层次化结构:树状和表格


- 轴向转换的函数
stack(): 将行索引变成列索引,可以理解为将表格数据转换为树状数据unstack(): 将列索引变成行索引,可以理解为将树状数据转换为表格数据- 两个函数互为逆函数,作用相反,用法相同。单级索引时,结果会生成一个Series;多级索引时默认转换最内层索引,也可以自定义转换的索引层级
- 示例
print(df) # 数据源
-------------------------------------------------------------------------------------
Language English Chinese
Pass Y N Y N
Class Six
1 girl 86 99 111 105
boy 85 110 113 112
2 girl 98 106 108 94
boy 117 80 97 83
3 girl 95 81 114 95
boy 106 95 119 81 df.stack() # 默认将最内层的行索引(Pass)转换为了列索引
-------------------------------------------------------------------------------------
Language Chinese English
Class Six Pass
1 girl N 105 99
Y 111 86
boy N 112 110
Y 113 85
2 girl N 94 106
Y 108 98
boy N 83 80
Y 97 117
3 girl N 95 81
Y 114 95
boy N 81 95
Y 119 106 df.unstack(level=0) # 指定将列索引(Class)转化成行索引
-------------------------------------------------------------------------------------
Language English Chinese
Pass Y N Y N
Class 1 2 3 1 2 3 1 2 3 1 2 3
Six
boy 85 117 106 110 80 95 113 97 119 112 83 81
girl 86 98 95 99 106 81 111 108 114 105 94 95
七、多级索引转换单级索引
- 步骤:先将多级的行索引转换为列索引,再重置列索引
- 示例
dt = df.stack() # 将内层行索引()转换为列索引
dt = dt.reset_index() # 重置列索引 print(dt)
-------------------------------------------------------------------------------------
Language Class Six Pass Chinese English
0 1 girl N 105 99
1 1 girl Y 111 86
2 1 boy N 112 110
3 1 boy Y 113 85
4 2 girl N 94 106
5 2 girl Y 108 98
6 2 boy N 83 80
7 2 boy Y 97 117
8 3 girl N 95 81
9 3 girl Y 114 95
10 3 boy N 81 95
11 3 boy Y 119 106
Pandas进阶之DataFrame多级索引的更多相关文章
- 数据分析入门——pandas之DataFrame多层/多级索引与聚合操作
一.行多层索引 1.隐式创建 在构造函数中给index.colunms等多个数组实现(datafarme与series都可以) df的多级索引创建方法类似: 2.显式创建pd.MultiIndex 其 ...
- Pandas系列(十八)- 多级索引
多级索引 多级索引(也称层次化索引)是pandas的重要功能,可以在Series.DataFrame对象上拥有2个以及2个以上的索引.实质上,单级索引对应Index对象,多级索引对应MultiInde ...
- 程序员用于机器学习编程的Python 数据处理库 pandas 进阶教程
数据访问 在入门教程中,我们已经使用过访问数据的方法.这里我们再集中看一下. 注:这里的数据访问方法既适用于Series,也适用于DataFrame. **基础方法:[]和. 这是两种最直观的方法,任 ...
- pandas | 使用pandas进行数据处理——DataFrame篇
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是pandas数据处理专题的第二篇文章,我们一起来聊聊pandas当中最重要的数据结构--DataFrame. 上一篇文章当中我们介绍了 ...
- pandas 学习(2): pandas 数据结构之DataFrame
DataFrame 类型类似于数据库表结构的数据结构,其含有行索引和列索引,可以将DataFrame 想成是由相同索引的Series组成的Dict类型.在其底层是通过二维以及一维的数据块实现. 1. ...
- python数据分析之pandas库的DataFrame应用二
本节介绍Series和DataFrame中的数据的基本手段 重新索引 pandas对象的一个重要方法就是reindex,作用是创建一个适应新索引的新对象 ''' Created on 2016-8-1 ...
- pandas数据结构之Dataframe
Dataframe DataFrame是一个[表格型]的数据结构,可以看做是[由Series组成的字典](多个series共用同一个索引).DataFrame由按一定顺序排列的多列数据组成.设计初衷是 ...
- [转]python中pandas库中DataFrame对行和列的操作使用方法
转自:http://blog.csdn.net/u011089523/article/details/60341016 用pandas中的DataFrame时选取行或列: import numpy a ...
- Pandas之Series+DataFrame
Series是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,python对象) index查看series索引,values查看series值 series相比于ndarray,是一 ...
随机推荐
- .NET Framework 项目多环境下配置文件web.config
解决jenkins自动构建发布的问题,统一从git/svn库中获取项目文件,根据不同配置编译发布到多个运行环境中. 转自:https://www.cnblogs.com/hugogoos/p/6426 ...
- D. Zero Quantity Maximization ( Codeforces Round #544 (Div. 3) )
题目链接 参考题解 题意: 给你 整形数组a 和 整形数组b ,要你c[i] = d * a[i] + b[i], 求 在c[i]=0的时候 相同的d的数量 最多能有几个. 思路: 1. 首先打开 ...
- list去重,String[]去重,String[]去空,StringBuffer去重,并且以','隔开,list拆分
1.// 删除ArrayList中重复元素 public static void removeDuplicate(List list) { HashSet h = new HashSet(list); ...
- Alpha版本1之后的成绩汇总
作业要求 1.作业内容: 作业具体要求及评分标准的链接 2.评分细则 •给出开头和团队成员列表(10’) •给出发布地址以及安装手册(20’) •给出测试报告(40’) •给出项目情况总结(30’) ...
- Jupyter Notebook(持续更新)
1.引用Pandas import pandas as pd 2.创建DataFrame bb=pd.DataFrame(enron_data) 3.查看列 & 行 dataFrame.sha ...
- c++中关联容器set的使用
c++中set的用法 #include<iostream> #include<vector> #include<algorithm> #include<set ...
- insmod: ERROR: could not insert module dm-snapshot.ko: Unknown symbol in module
下面方法成功的前提是你的mod和你的操作系统版本是匹配的,也就是说你的mod之前成功过.说个多余的提示,mod在/lib/modules目录里面 insmod: ERROR: could not in ...
- Clickhouse 性能瓶颈排查 IO过高
前几天公司clickhouse 有个查询很慢.经理一直追问为什么慢 是cpu 不够 还是IO 占用太高,还是其他的原因.于是有了以下的排查 执行该条,在不考虑优化sql 的情况下 进行性能排查 1.首 ...
- 洛谷 P1250 种树 题解
差分约束系统,维护前缀和,根据式子d[ b ] < = d[ e + 1 ] - t,可以看出要连e和b - 1,但占用了超级源点0,所以要把区间向后移,这样就可以用超级源点0来保持图的连通性( ...
- 【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie
感觉这个线段树分治和整体二分几乎相同啊~ code: #include <bits/stdc++.h> #define MAX 100300 #define ll long long #d ...