Pandas_03层次化索引

17 篇文章 2 订阅

一、层次化索引:

在一个轴上拥有多个索引(两个及以上),它使得我们能以低纬度形式处理高纬度数据。层次化索引在数据重塑和基于分组的操作(透视表的生成)中扮演重要角色。

简单的说,层次化索引就是轴上有多个级别的索引。

二、带层次化索引的Series数组对象

1、创建带层次化索引的Series数组对象

import pandas as pd
import numpy as np

data = pd.Series(np.random.randint(1,10,10),index=[['a','a','a','b','b','b','c','c','c','c'], \
                                                    [1,2,3,1,2,3,1,2,3,4]],name = '随机整数')
data

out:
90.png#pic_center)

# 设置每一级索引的名称
data.index.names=['class1','class2']
data

在这里插入图片描述

# 查看Series的索引
data.index

levels:每个级别的标签去重后的数组
labels:以整数来表示每个level上标签的位置
names:每个级别索引的名字

MultiIndex(levels=[['a', 'b', 'c'], [1, 2, 3, 4]],
           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2, 3]],
           names=['class1', 'class2'])

2、利用层次化索引进行查询

  • 通过一级索引进行数据查询
# 通过一级索引进行查询
data['a']

在这里插入图片描述

  • 通过二级索引进行数据查询
# 通过二级索引进行查询
data[:,2]

在这里插入图片描述

  • 通过两级索引共同进行数据查询
data['a',2]
# 输出9

3、数据的重塑 pd.unstack()

'''
Series.unstack(level=-1, fill_value=None)

参数说明:
level:默认-1,按照最后一级的列索引,将列数据变成行数据
fill_value:若有缺失值,可选择填充字符

函数作用:将数据的行“旋转”为列
'''
# Series.unstack(level=-1, fill_value=None)
data.unstack()

重塑前:

一维数组,只有一行数据
在这里插入图片描述

重塑后:

行数据变成了列数据,因为一级索引a、b 与 二级索引4对应的地方无数据,所以显示成缺失值NaN

注意:此时是一个三行四列的二维数组DataFrame!!!

在这里插入图片描述
填补缺失值为0

data.unstack(fill_value = 0)

在这里插入图片描述
指定按照一级索引(最外面一层索引)进行数据重塑

data.unstack(level=0,fill_value=0)

在这里插入图片描述
对应的使用stack()即可将列数据转换成行数据

data.unstack(level=0,fill_value=0).stack()

在这里插入图片描述

三、带层次化索引的DataFrame数组对象

1、创建带层次化索引的DataFrame数组对象

准备数据

import os

# 如果路径名包含中文,那么read_csv无法读取到文件,可先使用os.chdir。
os.chdir('E:\学习文档\data')

book_data = pd.read_csv("books.csv",encoding='gbk',sep=',',dtype={'original_publication_year':str} \
                        ,usecols =['isbn','authors','original_publication_year','language_code','books_count','ratings_count'])
book_data.head()

在这里插入图片描述

# 查看数据相关基础信息
book_data.info()

在这里插入图片描述

  • 设置多层行索引

# 设置多层行索引
book_data.set_index(['original_publication_year','language_code'],inplace =True)
book_data.head()

效果如下:
在这里插入图片描述
查看行索引:

book_data.index

可以看出行索引是多重索引:

在这里插入图片描述在这里插入图片描述

  • 设置多层列索引

设置多层列索引前:

在这里插入图片描述
设置多层索引:

book_data.columns=[['base_info','base_info','count_info','count_info'],['isbn','authors','books_count','ratings_count']]
book_data.head()

设置多层列索引后:

在这里插入图片描述
可以设置一下不同级别的列索引的名称

book_data.columns.names = ['info','detail']

在这里插入图片描述
2、利用层次化索引进行查询

  • 通过第一层行索引检索数据
# 通过第一层行索引检索数据
book_data.loc['2008'].head()

在这里插入图片描述

  • 通过多层行索引检索数据
    (多层索引,要以元组形式进行查询)
book_data.loc[('2008','eng')].head()

在这里插入图片描述

  • 通过第一层列索引检索数据
book_data['base_info'].head()

在这里插入图片描述

  • 通过第二层列索引检索数据
book_data['isbn'].head()

报错:KeyError: ‘isbn’

要与第一层列索引一起使用

book_data['base_info','isbn'].head()

在这里插入图片描述
另外一种写法

book_data.loc[:,('base_info','isbn')].head()

四、重排分级数据

  • swaplevel()

交换行索引级别

'''
swaplevel(i=-2, j=-1, axis=0)

i,j:要交换分级顺序的索引的下标

'''
book_data.swaplevel().head()

在这里插入图片描述
交换列索引级别

book_data.swaplevel(i=-2, j=-1,axis=1).head()

在这里插入图片描述

  • 常搭配sortlevel()一起使用

'''book_data.sortlevel(level=0, axis=0, ascending=True, inplace=False, sort_remaining=True)'''
book_data.swaplevel(i=-2, j=-1,axis=1).sortlevel(0,axis = 0,ascending=False)

# book_data.sort_index(level = 0,axis = 0,ascending=False)
# 效果相同

在这里插入图片描述

如果索引是按字典方式,从外到内排序,调用sortlevel(0)或者sort_index()

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DataFrame的层次化索引是指在DataFrame的行或列上使用多个索引级别来表示数据的一种结构。这种索引结构可以让我们在一个轴上拥有多个索引级别。 在构建DataFrame的层次化索引时,可以通过多种方法实现。一种方法是在导入数据时直接使用列名作为行索引,使用`index_col`参数来指定多个列作为索引。另一种方法是使用`set_index()`方法将某几列设置为索引。设置索引后,可以选择是否保留原始列作为DataFrame的一部分。而要将层次化索引转换为二维表格形式,可以使用`reset_index()`函数。 除了以上方法,还可以在创建DataFrame时直接指定多级索引,可以通过使用一个由列表或数组组成的列表作为索引来实现。例如,可以使用`pd.DataFrame()`函数的`index`参数来指定多级索引的值。 综上所述,DataFrame的层次化索引可以通过在导入数据时设置索引列,使用`set_index()`方法或在创建DataFrame时直接指定多级索引来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python学习笔记8——Series与DataFrame层次化索引](https://blog.csdn.net/weixin_44181744/article/details/105977700)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [pandas 层次化索引的实现方法](https://download.csdn.net/download/weixin_38679651/14914102)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值