📅  最后修改于: 2023-12-03 15:08:43.978000             🧑  作者: Mango
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 中的分层索引可以更好地组织和处理数据。在创建、访问、切片和交换分层索引时需要注意方法的使用方式。