Pandas数据分析14——pandas数据框的多层索引
参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》
pandas数据框针对高维数据,也有多层索引的办法去应对。多层数据一般长这个样子
可以看到AB两大列,下面又有xy两小列。 行有abc三行,又分为onetwo两小行。
在分组聚合的时候也会产生多层索引,下面演示一下。
导入包和数据
import numpy as np
import pandas as pd
df=pd.read_excel('team.xlsx')
分组聚合
df.groupby(['team',df.mean(1)>60]).count() #每组平均分大于60的人的个数
可以看到分为abcde五组,平均分大于60 的组员两小行。
创建多层索引
#序列中创建
arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
index=pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
index
pd.DataFrame([{'a':1, 'b':2}], index=index)
#来自元组创建
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
pd.Series(np.random.randn(8), index=index)
#可迭代对象的笛卡尔积,排列组合各种情况
numbers = [0, 1, 2]
colors = ['green', 'purple']
index = pd.MultiIndex.from_product([numbers, colors],names=['number', 'color'])
pd.Series(np.random.randn(6), index=index)
#来自 DataFrame
df = pd.DataFrame([['bar', 'one'], ['bar', 'two'],['foo', 'one'], ['foo', 'two']],columns=['first', 'second'])
'''first second
0 bar one
1 bar two
2 foo one
3 foo two
'''
index = pd.MultiIndex.from_frame(df)
pd.Series(np.random.randn(4), index=index)
多层索引操作
index_arrays = [[1, 1, 2, 2], ['男', '女', '男', '女']]
columns_arrays = [['2020', '2020', '2021', '2021'],['上半年', '下半年', '上半年', '下半年',]]
index = pd.MultiIndex.from_arrays(index_arrays,names=('班级', '性别'))
columns = pd.MultiIndex.from_arrays(columns_arrays,names=('年份', '学期'))
df = pd.DataFrame([(88,99,88,99),(77,88,97,98),(67,89,54,78),(34,67,89,54)],columns=columns, index=index)
df
索引名称的查看
#索引名称的查看:
df.index # 索引, 是一个 MultiIndex
df.columns # 引索引,也是一个 MultiIndex
# 查看行索引的名称
df.index.names # FrozenList(['班级', '性别'])
# 查看列索引的名称
df.columns.names # FrozenList(['年份', '学期'])
索引的层级
#索引的层级:
df.index.nlevels # 层级数 2
df.index.levels # 行的层级 # FrozenList([[1, 2], ['女', '男']])
df.columns.levels # 列的层级 # FrozenList([['2020', '2021'], ['上半年', '下半年']])
df[['2020','2021']].index.levels # 筛选后的层级 # FrozenList([[1, 2], ['女', '男']])
索引内容的查看
#索引内容的查看:
# 获取索引第2层内容
df.index.get_level_values(1)
# Index(['男', '女', '男', '女'], dtype='object', name='性别')
# 获取列索引第1层内容
df.columns.get_level_values(0)
# Index(['2020', '2020', '2021', '2021'], dtype='object', name='年份')# 按索引名称取索引内容
df.index.get_level_values('班级')
# Int64Index([1, 1, 2, 2], dtype='int64', name='班级')
df.columns.get_level_values('年份')
# Index(['2020', '2020', '2021', '2021'], dtype='object', name='年份')# 多层索引的数据类型,1.3.0+
df.index.dtypes
#排序
# 使用索引名可进行排序,可以指定具体的列
df.sort_values(by=['性别', ('2020','下半年')])
df.index.reorder_levels([1,0]) # 等级顺序,互换
df.index.set_codes([1, 1, 0, 0], level='班级') # 设置顺序
df.index.sortlevel(level=0, ascending=True) # 按指定级别排序
df.index.reindex(df.index[::-1]) # 更换顺序,或者指定一个顺序
相关操作转换
df.index.to_numpy() # 生成一个笛卡尔积的元组对列表
# array([(1, '男'), (1, '女'), (2, '男'), (2, '女')], dtype=object)
df.index.remove_unused_levels() # 返回没有使用的层级
df.swaplevel(0, 2) # 交换索引
df.to_frame() # 转为 DataFrame
idx.set_levels(['a', 'b'], level='bar') # 设置新的索引内容
idx.set_levels([['a', 'b', 'c'], [1, 2, 3, 4]], level=[0, 1])
idx.to_flat_index() # 转为元组对列表
df.index.droplevel(0) # 删除指定等级
df.index.get_locs((2, '女')) # 返回索引的位置
数据查询
#查询指定行
df.loc[1] #一班的
df.loc[(1, '男')] # 一年级男
df.loc[1:2] # 一二两年级数据
#查询指定列
df['2020'] # 整个一级索引下
df[('2020','上半年')] # 指定二级索引
df['2020']['上半年'] # 同上
#行列综合 slice(None)表示本层所有内容
df.loc[(1, '男'), '2020'] # 只显示2020年一年级男
df.loc[:, (slice(None), '下半年')] # 只看下半年的
df.loc[(slice(None), '女'),:] # 只看女生
df.loc[1, (slice(None)),:] # 只看1班
df.loc[:, ('2020', slice(None))] # 只看 2020 年的
总结:
#查询指定条件
#和单层索引的数据查询一样,不过在选择列上要按多层的规则。
df[df[('2020','上半年')] > 80]
#pd.IndexSlice切片使用:idx = pd.IndexSlice
idx[0] # 0
idx[:] # slice(None, None, None)
idx[0,'x'] # (0, 'x')
idx[0:3] # slice(0, 3, None)
idx[0.1:1.5] # slice(0.1, 1.5, None)
idx[0:5,'x':'y'] # (slice(0, 5, None), slice('x', 'y', None))
#查询应用:
idx = pd.IndexSlice
df.loc[idx[:,['男']],:] # 只显示男
df.loc[:,idx[:,['上半年']]] # 只显示上半年#df.xs()
df.xs((1, '男')) # 一年级男生
df.xs('2020', axis=1) # 2020 年
df.xs('男', level=1) # 所有男生
数据分组
df.groupby(level=0).sum()
df.groupby(level='性别').sum()
df.sum(level='班级') # 也可以直接统计
df.groupby(level=['性别', '班级']).sum()
Pandas数据分析14——pandas数据框的多层索引相关推荐
- pandas把dataframe的数据列转化为索引列实战:单列转化为索引、多列转化为复合索引
pandas把dataframe的数据列转化为索引列实战:单列转化为索引.多列转化为复合索引 目录
- Pandas数据分析15——pandas数据透视表和交叉表
参考书目:<深入浅出Pandas:利用Python进行数据处理与分析> pandas对数据框也可以像excel一样进行数据透视表整合之类的操作.主要是针对分类数据进行操作,还可以计算数值型 ...
- pandas数据分析航空公司数据
pandas数据分析 pandas主要有两种数据结构,分别是dataframe和series,本次我们主要讲述的是dataframe的简单应用,从数据的读取到清洗. 数据读取与观察 1.pandas读 ...
- 【pandas数据分析】pandas数据结构
文章目录 Series 创建Series 从dict创建 从ndarray创建 从标量创建 Series的特性 类ndarray 类dict 向量化操作与标签对齐 名称属性 DataFrame 创建D ...
- Python数据分析 | DataFrame(数据框)
DataFrame DataFrame是Pandas包提供的一种类似关系表的数据结构 定义 直接定义(很少使用) pd.DataFrame() 参数可以是numPy.列表.字典.元组.Series等 ...
- Pandas数据分析17——pandas数据清洗(缺失值、重复值处理)
参考书目:<深入浅出Pandas:利用Python进行数据处理与分析> pandas对大数据有很多便捷的清洗用法,尤其针对缺失值和重复值.缺失值就不用说了,会影响计算,重复值有时候可能并未 ...
- Pandas数据分析18——pandas文本处理
参考书目:<深入浅出Pandas:利用Python进行数据处理与分析> pandas对文本数据也有很多便捷处理方法,可以不用写循环,向量化操作运算速度快,还可以进行高级的正则表达式,各种复 ...
- Pandas数据分析03——pandas索引设置和操作(用法全面解析)
参考书目:<深入浅出Pandas:利用Python进行数据处理与分析> pandas的数据结构和excel表类似,会有行列,还有各自的名称,这些行列就是索引,通过索引可以快速找到数据. 建 ...
- Pandas数据分析16——pandas生成虚拟变量,因子化,列表爆炸等操作
参考书目:<深入浅出Pandas:利用Python进行数据处理与分析> pandas对数据框的分类变量有很多独特的操作,可以方便我们生成虚拟变量,或者是将文本型分类数据转化为数值型分类数据 ...
最新文章
- Spring MVC拦截器
- java读取excel中的数据存到数据库
- Linux的phpize添加php扩展
- function checkBrowser()//判断浏览器
- SQL2008 收缩日志和数据脚本
- python 去掉空格_如何从Python DataFrame中去除空格在这个例子中
- 《剑指Offer》解题目录(更新完毕)
- 通过这本拼图学习Bash
- java 非法线程_JVM中的线程行为
- java反射集合类_java反射 - lara - OSCHINA - 中文开源技术交流社区
- python GUI编程
- 自定mvc之新增,下架以及上架
- java 合并两个有序链表
- Robot fish: bio-inspired fishlike underwater robots 阅读笔记 1
- 第6章 PPT页面排版与高级设计技术
- 转载:使用expdp/impdp进行数据库迁移
- 计算机每次网络重插才能启动,为何电脑开机后再插网线才能用_每次开机都要重插网线的解决方法...
- android 扫描二维码黑屏,android--zxing返回扫描界面出现黑屏的解决方案
- Java基础练习——吃货联盟
- JetBrains IDE全新UI预览版来了,要做简洁与强大兼顾的IDE