📜  如何在 Pandas 中使用分层索引?(1)

📅  最后修改于: 2023-12-03 15:08:43.978000             🧑  作者: Mango

如何在 Pandas 中使用分层索引?

Pandas 中的分层索引(Hierarchical Indexing)可以让我们在一个轴上拥有多层索引,从而更好地组织和处理数据。本文将介绍如何使用 Pandas 中的分层索引。

创建分层索引

我们可以通过多种方式在 Pandas 中创建分层索引,比如:

从元组列表创建分层索引
import pandas as pd

data = [ ('foo', 'one', 1, 10), ('foo', 'one', 2, 20), 
         ('foo', 'two', 1, 30), ('foo', 'two', 2, 40),
         ('bar', 'one', 1, 50), ('bar', 'one', 2, 60),
         ('bar', 'two', 1, 70), ('bar', 'two', 2, 80)]

df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D'])
df = df.set_index(['A', 'B', 'C'])
print(df)

输出:

          D
A   B   C   
foo one 1  10
        2  20
    two 1  30
        2  40
bar one 1  50
        2  60
    two 1  70
        2  80
从字典创建分层索引
import pandas as pd

data = {'A': ['foo', 'foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'bar'],
        'B': ['one', 'one', 'two', 'two', 'one', 'one', 'two', 'two'],
        'C': [1, 2, 1, 2, 1, 2, 1, 2],
        'D': [10, 20, 30, 40, 50, 60, 70, 80]}

df = pd.DataFrame(data)
df = df.set_index(['A', 'B', 'C'])
print(df)

输出:

          D
A   B   C   
foo one 1  10
        2  20
    two 1  30
        2  40
bar one 1  50
        2  60
    two 1  70
        2  80
访问分层索引

我们可以使用 .loc[] 方法访问分层索引中的数据。例如:

import pandas as pd

data = [ ('foo', 'one', 1, 10), ('foo', 'one', 2, 20), 
         ('foo', 'two', 1, 30), ('foo', 'two', 2, 40),
         ('bar', 'one', 1, 50), ('bar', 'one', 2, 60),
         ('bar', 'two', 1, 70), ('bar', 'two', 2, 80)]

df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D'])
df = df.set_index(['A', 'B', 'C'])
print(df.loc['foo'])

输出:

      D
B   C   
one 1  10
    2  20
two 1  30
    2  40

我们也可以使用多个索引来访问分层索引中的数据,例如:

import pandas as pd

data = [ ('foo', 'one', 1, 10), ('foo', 'one', 2, 20), 
         ('foo', 'two', 1, 30), ('foo', 'two', 2, 40),
         ('bar', 'one', 1, 50), ('bar', 'one', 2, 60),
         ('bar', 'two', 1, 70), ('bar', 'two', 2, 80)]

df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D'])
df = df.set_index(['A', 'B', 'C'])
print(df.loc[('foo', 'one', 1)])

输出:

D    10
Name: (foo, one, 1), dtype: int64
切片分层索引

我们可以使用切片方法对分层索引进行切片。例如:

import pandas as pd

data = [ ('foo', 'one', 1, 10), ('foo', 'one', 2, 20), 
         ('foo', 'two', 1, 30), ('foo', 'two', 2, 40),
         ('bar', 'one', 1, 50), ('bar', 'one', 2, 60),
         ('bar', 'two', 1, 70), ('bar', 'two', 2, 80)]

df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D'])
df = df.set_index(['A', 'B', 'C'])
print(df.loc[('foo', 'one'):('foo', 'two')])

输出:

      D
A   B C   
foo one 1  10
       2  20
    two 1  30
       2  40
交换分层索引

我们可以使用 swaplevel() 方法交换分层索引中的层。例如:

import pandas as pd

data = [ ('foo', 'one', 1, 10), ('foo', 'one', 2, 20), 
         ('foo', 'two', 1, 30), ('foo', 'two', 2, 40),
         ('bar', 'one', 1, 50), ('bar', 'one', 2, 60),
         ('bar', 'two', 1, 70), ('bar', 'two', 2, 80)]

df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D'])
df = df.set_index(['A', 'B', 'C'])
df = df.swaplevel('A', 'C')
print(df)

输出:

          D
C A   B    
1 foo one  10
2 foo one  20
1 foo two  30
2 foo two  40
1 bar one  50
2 bar one  60
1 bar two  70
2 bar two  80
总结

使用 Pandas 中的分层索引可以更好地组织和处理数据。在创建、访问、切片和交换分层索引时需要注意方法的使用方式。