对pandas的层次索引与取值的新方法详解

  • Post category:Python

对Pandas的层次索引和取值的新方法是Pandas中非常强大的功能之一。本攻略将详细介绍Pandas中层次索引和取值的新方法,包括如何创建、访问和操作层次索引。

创建层次索引

在Pandas中,我们可以通过两种方式创建层次索引:使用元组或使用字典。

使用元组

使用元组创建层次索引可以通过 pd.MultiIndex.from_tuples() 方法实现。例如:

import pandas as pd

index = pd.MultiIndex.from_tuples([('张三', '初中'), ('张三', '高中'), ('李四', '高中'), ('王五', '初中')], names=['name', 'grade'])

此处我们创建了一个包含四个元素的元组列表,每个元组包含两个值:学生姓名和年级。我们可以通过 names 参数为每个级别指定名称,这里我们分别指定为 namegrade

使用字典

使用字典创建层次索引可以通过 pd.MultiIndex.from_dict() 方法实现。例如:

import pandas as pd

index = pd.MultiIndex.from_dict({'name': ['张三', '张三', '李四', '王五'], 'grade': ['初中', '高中', '高中', '初中']})

此处我们创建了一个包含两个键(即两个级别)的字典,每个键对应一个值列表,分别表示学生姓名和年级。

访问层次索引

访问层次索引可以通过 loc[]iloc[] 进行。其中 loc[] 基于标签进行访问,iloc[] 基于整数索引进行访问。

基于标签

基于标签的访问可以通过在 loc[] 中使用元组进行。例如:

import pandas as pd

df = pd.DataFrame({'math': [80, 90, 95, 85], 'english': [85, 87, 88, 86]}, index=pd.MultiIndex.from_tuples([('张三', '初中'), ('张三', '高中'), ('李四', '高中'), ('王五', '初中')], names=['name', 'grade']))

print(df.loc[('张三', '初中')])

此处我们首先创建了一个包含两个层次的DataFrame,然后通过 loc[] 访问特定索引:

math       80
english    85
Name: (张三, 初中), dtype: int64

基于整数索引

基于整数索引的访问可以通过在 iloc[] 中使用整数进行。例如:

import pandas as pd

df = pd.DataFrame({'math': [80, 90, 95, 85], 'english': [85, 87, 88, 86]}, index=pd.MultiIndex.from_tuples([('张三', '初中'), ('张三', '高中'), ('李四', '高中'), ('王五', '初中')], names=['name', 'grade']))

print(df.iloc[0])

此处我们同样首先创建了一个包含两个层次的DataFrame,然后通过 iloc[] 访问特定索引:

math       80
english    85
Name: (张三, 初中), dtype: int64

操作层次索引

操作层次索引可以通过 stack()unstack()swaplevel() 等方法进行。其中 stack() 可将列转换为层次索引,unstack() 可将层次索引转换为列,swaplevel() 可交换两个级别的位置。

下面,给出两个示例说明。

示例 1:应用stack()方法

import pandas as pd

df = pd.DataFrame({'math': [80, 90, 95, 85], 'english': [85, 87, 88, 86]}, index=pd.MultiIndex.from_tuples([('张三', '初中'), ('张三', '高中'), ('李四', '高中'), ('王五', '初中')], names=['name', 'grade']))

stacked = df.stack()

print(stacked)

此处我们首先创建了一个包含两个层次的DataFrame,然后通过 stack() 方法将列转换为层次索引:

name  grade          
张三    初中     math       80
              english    85
      高中     math       90
              english    87
李四    高中     math       95
              english    88
王五    初中     math       85
              english    86
dtype: int64

示例 2:应用unstack()和swaplevel()方法

import pandas as pd

df = pd.DataFrame({'math': [80, 90, 95, 85], 'english': [85, 87, 88, 86]}, index=pd.MultiIndex.from_tuples([('张三', '初中'), ('张三', '高中'), ('李四', '高中'), ('王五', '初中')], names=['name', 'grade']))

unstacked = df.unstack('name')

swapped = unstacked.swaplevel('grade', 'subject', axis=1)

print(swapped)

此处我们首先创建了一个包含两个层次的DataFrame,然后通过 unstack() 方法将层次索引转换为列,接着通过 swaplevel() 方法交换两个级别的位置:

          math         english      
name        张三  李四  王五      张三  李四  王五
grade subject                              
初中    math   80   85  85      85  88  86
高中    math   90   95  85      87  88  86

通过以上两个示例,我们可以进一步理解Pandas中层次索引和取值的新方法。