pandas的分层索引 (MultiIndex) 讲解

pandas库的名字来源于3种主要数据结构开头字母的缩写:Panel,Dataframe,Series。其中Series表示一维数据,Dataframe表示二维数据,Panel表示三维数据。当数据高于二维时,一般却不用 Panel 表示,一般用包含多层级索引的Dataframe进行表示,而不是使用Panel。原因是使用多层级索引展示数据更加直观,操作数据更加灵活,并且可以表示3维,4维乃至任意维度的数据。

# 导包
import numpy as np
import pandas as pd
from pandas import Series,DataFrame

一、单层索引

sa = pd.Series([1, 2, 3], index=list('abc'))

结果:

 二、多层索引

分层索引是pandas中一个重要的特性,能让我们在一个轴(axis)上有多个index levels(索引层级)。它可以让我们在低维格式下处理高维数据。

 1、Series 多层索引

import pandas as pd
s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'],
                                   ['期中','期末','期中','期末','期中','期末']])

 

从图中数据可以看出,张三那一列是数据的第一层索引,期中那一列是数据的第二层索引,而第二层索引值是和数据一一对应的。

但是,我们在创建的时候发现,也需要将名字和考试阶段一一对应,才可以。

 2、DataFrame多层索引

#导入numpy并改名为np
import numpy as np 


# np.random.randint(0,100,size=(6,3)) 是使用numpy中的随机模块random中,生成随机整数方法randint,
# 里面的参数size是指定生成6行3列的数据,并且每个数字的范围在0到100之间。

da = np.random.randint(100,size=(6,3))
df1 = pd.DataFrame(da,index=[["a","a","b","b","c","c"],
                            ["期末","期中","期末","期中","期末","期中"]],
                   columns=["语文","英语","数学"])
df1

3、pd.MultiIndex

上面建索引的⽅式写起来很麻烦,我们要写很多重复的内容,所以pandas给我们提供了另⼀ 种⽅式(MultiIndex.from_product() )来构建多层索引。

使⽤MultiIndex.from_product()方法构建,⾸先我们把每层需要的索引写⼊到⼀个列表中,将这些列表在存⼊到⼀个新的列表当中,作为 参数传⼊MultiIndex.from_product()方法中,把结果赋值给变量index,那么这个index就 是我们构造好的索引,我们只需要在创建Series的时候传入索引即可。

# Series
names=["a","b","c"]
exems=["期中","期末"]
index=pd.MultiIndex.from_product([names,exems])
df = pd.Series(np.random.randint(0,150,size=6),index=index)
df

# DataFrame
names=["a","b","c"]
exems=["期中","期末"]
columns = ["语文","英语","数学"]
index=pd.MultiIndex.from_product([names,exems])
df2 = pd.DataFrame(da,index=index,columns=columns)
df2

 

该MultiIndex对象是标准Index对象的分层模拟 ,通常将轴标签存储在pandas对象中。您可以将其MultiIndex视为一个元组数组,其中每个元组都是唯一的。

MultiIndex可以从

数组列表(使用 MultiIndex.from_arrays())、

元组数组(使用 MultiIndex.from_tuples())、

可迭代的交叉集(使用 MultiIndex.from_product())

或DataFrame(使用 MultiIndex.from_frame()) 创建。

该Index构造函数将尝试返回MultiIndex时,它传递一个元组列表。

4、set_index 

# 方法将普通列转成多层级索引
da = np.random.randint(100,size=(6,3))
dic = {"class":["class1","class1","class2","class3"],
      "name":["linda","mark","lily","cherich"],
      "score":[100,123,120,116]}
df3 = pd.DataFrame(dic)
df3.set_index(["class","name"])

 

5、groupby 

# 用来聚合计算,比如mean
df3.groupby(['class','name']).mean()

 

6、pivot_table 

# 类似于excel的透视表,数据动态排布,分类汇总
df3.pivot_table(index=["class","name"])

 

三、多层索引的取值

1、直接提取[ ]

# 取单个值
df["a"]

 

#结果:69

df["a","期中"]
# 取多个不连续值
df[["a","c"]]

 

# 取多个连续的值
df[:"b"]

 

2、标签取值 loc[], loc 按自定义的行、列的数据进行取值,不遵循左闭右开 

# 取单个值
df.loc[:"a"]
# 取多个不连续值
df.loc[["a","c"]]
# 取多个连续的值
df.loc[:"b"]

 

 3、下标取值 iloc[], iloc 按默认的行、列索引的数据进行取值

# 取一个值
df4.iloc[0,3]
# 取多个值
df4.iloc[0,[3,5]]
# 取连续值 遵循左闭右开
df4.iloc[0:1,3:5]

四、多层索引的排序

1、按照索引排序,sort_index()

  • level=0 表示按照第⼀层索引进⾏排序,默认为0,为1表示优先按照第⼆层索引 ...
  • ascending=False 表示从⼤到⼩进⾏排列,默认为True(从⼩到⼤排序)
names=[1,2,3]
exems=["a","b"]
index=pd.MultiIndex.from_product([names,exems])
data1 = pd.Series([89,53,56,89,78,90],index=index)
# level = 0 则按照第一层索引排序  1 按照第二层
# ascending=False 降序 大到小  True 从小到大
data1.sort_index(level=0,ascending=False)

2、按照具体值(列名)排序,sort_value()

# series
data1.sort_values(ascending=False)
# dataFrame
df1.sort_values(by="语文",ascending=False)


参考:https://www.jianshu.com/p/10b96a839134

<think>好的,我现在要帮助用户解决关于Pandas中多重索引MultiIndex)的操作和使用方法的问题。首先,我需要回顾用户提供的引用内容,确保回答准确。引用[1]和[2]提到了MultiIndex的创建、索引操作、堆叠与取消堆叠,以及如何从多个数据框创建多重索引。用户特别想知道如何操作和使用这些值。 首先,我应该从基础开始,比如如何创建MultiIndex。用户可能已经知道一些方法,但需要系统的步骤。比如使用pd.MultiIndex.from_tuples或者set_index方法。然后,操作部分可能包括索引的交换、排序,以及使用stack和unstack进行结构转换。此外,用户可能需要了解如何从MultiIndex中选择数据,比如使用xs方法或loc索引器。 接下来,我需要检查是否有遗漏的重要操作,比如重置索引或处理多层索引的列。用户提供的示例中有涉及这些内容,所以应该包括进去。同时,生成相关问题也是必须的,这些问题需要围绕用户可能遇到的后续问题展开,比如性能优化或实际应用场景。 需要注意的是,确保所有代码示例正确,并且符合LaTeX格式的要求。数学表达式如DataFrame结构需要用行内格式,而独立公式可能需要用$$,不过在这个主题中可能较少涉及数学公式,更多是代码和结构示例。因此,重点放在正确的代码块和MultiIndex操作步骤上。 最后,确保回答结构清晰,分点说明,并自然融入引用标记。例如,在提到set_index或stack方法时,引用用户提供的资料。同时,生成的问题要针对用户可能想深入的方向,如高级操作或性能问题,这有助于用户进一步学习。</think>### Pandas多重索引MultiIndex)操作指南 --- #### 一、创建多重索引 1. **从元组列表创建** 使用`pd.MultiIndex.from_tuples()`直接生成: ```python import pandas as pd tuples = [('A', 1), ('A', 2), ('B', 1), ('B', 2)] multi_index = pd.MultiIndex.from_tuples(tuples, names=['Level1', 'Level2']) df = pd.DataFrame({'Value': [10, 20, 30, 40]}, index=multi_index) ``` 2. **通过`set_index`方法转换** 将现有列设为索引: ```python df = pd.DataFrame({ 'Level1': ['A', 'A', 'B', 'B'], 'Level2': [1, 2, 1, 2], 'Value': [10, 20, 30, 40] }) df = df.set_index(['Level1', 'Level2']) ``` --- #### 二、索引操作 1. **交换索引层级** 使用`swaplevel()`调整层级顺序: ```python df_swapped = df.swaplevel('Level1', 'Level2') ``` 2. **按索引排序** 使用`sort_index()`对索引排序: ```python df_sorted = df.sort_index(level='Level1', ascending=False) ``` 3. **提取索引值** 通过`.index`属性访问索引对象: ```python index_values = df.index.get_level_values('Level1') # 提取Level1的索引值 ``` --- #### 三、数据选择与过滤 1. **使用`xs`方法跨层选择** 提取特定层级的值: ```python subset = df.xs(key='A', level='Level1') # 选择Level1='A'的所有行 ``` 2. **`loc`索引器的多层筛选** 按多个层级条件筛选: ```python subset = df.loc[('A', 1), :] # 选择Level1='A'且Level2=1的行 ``` --- #### 四、结构变换:堆叠与取消堆叠 1. **`stack()`:列转索引(堆叠)** 将列转换为索引层级: ```python df_unstacked = df.unstack(level='Level1') df_stacked = df_unstacked.stack() ``` 2. **`unstack()`:索引转列(取消堆叠)** 将索引层级转换为列: ```python df_unstacked = df.unstack(level='Level2') # 将Level2转为列 ``` --- #### 五、重置索引 1. **`reset_index()`:索引转为列** 将索引层级还原为普通列: ```python df_reset = df.reset_index() # 所有索引转为列 ``` --- #### 六、应用场景示例 1. **多维数据分析** 例如分析时间序列与地区组合的数据: ```python dates = pd.date_range('2023-01-01', periods=3) regions = ['North', 'South'] multi_index = pd.MultiIndex.from_product([dates, regions], names=['Date', 'Region']) sales_data = pd.DataFrame({'Sales': [200, 150, 300, 250, 400, 350]}, index=multi_index) ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

种麦南山下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值