Python Pandas – 使用MultiIndex的级别创建DataFrame作为列并替换索引级别名称
Pandas是Python上一个较为流行的数据处理库,其中的MultiIndex类可以方便地处理多级别的索引数据,使得Pandas的数据操作更加灵活。本篇文章将为大家介绍如何使用MultiIndex的级别在DataFrame中创建列并替换索引级别名称。
MultiIndex的级别
在使用Pandas进行数据分析时,我们通常会使用DataFrame或者Series的对象,其中包含多个数据列,并以行和列的方式表示。对于这些数据集合,我们可能需要使用多级别的索引访问其中的数据,例如,我们可能会对下面这个数据集合通过两级别的索引进行访问:
| One | Two | Three |
|---|---|---|
| A | B | 10 |
| A | C | 20 |
| B | D | 30 |
这里的数据集合有三列,其中One和Two列作为辅助索引(也称为“行索引”),而Three列将作为数据元素。我们可以通过在使用Pandas时将辅助索引设置成多级别的方式来访问数据:
import pandas as pd
data = pd.read_csv('example.csv')
df = data.set_index(['One', 'Two'])
df.loc[('A', 'B'), 'Three']
这里,我们可以使用元组(A, B)作为辅助索引的查询,获取到对应元素10。这是访问Pandas数据框架中的多级别辅助索引的方式。
在上述示例中,我们可以看到df数据框架的索引由两级别的辅助索引构成。创建这样一个数据框架的方法就是使用Pandas的MultiIndex类。
import pandas as pd
df = pd.DataFrame({'One': ['A', 'A', 'B'],
'Two': ['B', 'C', 'D'],
'Three': [10, 20, 30]})
df.set_index(['One', 'Two'], inplace=True)
这里我们使用了Pandas的DataFrame类来创建一些数据,然后使用set_index函数设置辅助索引时传入由两个列名称组成的列表即可构建一份MultiIndex类型的数据。
MultiIndex级别的创建
Python的Pandas库提供了多种方式来创建MultiIndex类型的数据,下面将分别介绍几种常用的方法。
使用from_tuples创建
我们可以通过提供一个元组列表来创建一个简单多级标签。下面是一个例子:
import pandas as pd
tuples = [('A', 'C'), ('A', 'D'), ('B', 'E'), ('B', 'F')]
multi_index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame({'Third': [1, 2, 3, 4]}, index=multi_index)
print(df)
这个例子创建了一个4行1列的Pandas数据框架,其中标签部分的两级别的值分别是[('A', 'C'), ('A', 'D'), ('B', 'E'), ('B', 'F')],对应于名为'first'和'second'的两级别索引。
使用from_product创建
元组列表不是我们创建MultiIndex对象的唯一方式。我们可以使用from_product方法来传入一组列表对象来创建标签。例如:
import pandas as pd
col1 = ['X', 'Y', 'Z']
col2 = ['A', 'B', 'C']
multi_index = pd.MultiIndex.from_product([col1, col2], names=['first', 'second'])
df = pd.DataFrame({'Third': [1, 2, 3, 4, 5, 6, 7, 8, 9]}, index=multi_index)
print(df)
这个例子也创建了一个4行1列的Pandas数据框,其中标签的两级别的值分别是['X', 'Y', 'Z']与['A', 'B', 'C']的笛卡尔积,对应于名为'first'和'second'的两级辅助索引。
使用from_frame创建
我们还可以使用from_frame方法直接从DataFrame对象中创建MultiIndex对象:
import pandas as pd
df = pd.DataFrame({'First':['A', 'A', 'B', 'B', 'C', 'C'],
'Second':['X', 'Y', 'X', 'Y', 'X', 'Y'],
'Third':[1, 2, 3, 4, 5 ,6]})
multi_index = pd.MultiIndex.from_frame(df[['First', 'Second']])
df = df.set_index(multi_index)
print(df)
这个例子创建了一个含有三列数据的数据框架,并利用from_frame方法来构建MultiIndex辅助索引。
利用MultiIndex创建DataFrame列
使用多级别的索引可以帮助我们更好地处理数据,而同时,使用多级别的索引,也可以更加简单地创建Pandas数据框中的列。下面我们将演示如何利用MultiIndex创建DataFrame列的例子:
import pandas as pd
idx = pd.IndexSlice
df = pd.DataFrame({
('A', 'B'): [1, 2],
('A', 'C'): [3, 4],
('B', 'C'): [5, 6],
}, index=['X', 'Y'])
df.columns.names = ['first', 'second']
print("原始的DataFrame:")
print(df)
df2 = df.stack().reset_index()
df2.columns = ['index', 'first', 'second', 'value']
print("经过stack和reset_index操作后的DataFrame:")
print(df2)
df3 = df2.pivot(index='index', columns=['first', 'second'], values='value')
df3.columns.names = ['first', 'second']
print("根据多级别索引创建过后的DataFrame:")
print(df3)
这个例子中的DataFrame包含了三列数据,并且使用多级别的列名,可以看出这样的数据结构很难进行操作。我们通过使用stack方法将所有列拆分为行,并使用reset_index方法来将行索引重新编号。然后,我们使用pivot方法来创建新的DataFrame,将(first, second)列中的值作为多级别列名。
结果输出:
原始的DataFrame:
first A B
second B C C
X 1 3 5
Y 2 4 6
经过stack和reset_index操作后的DataFrame:
index first second value
0 X A B 1
1 X A C 3
2 X B C 5
3 Y A B 2
4 Y A C 4
5 Y B C 6
根据多级别索引创建过后的DataFrame:
first A B
second B C C
index
X 1 3 5
Y 2 4 6
替换MultiIndex级别的名称
我们可以通过设置MultiIndex对象的names属性来替换这些级别的名称:
import pandas as pd
idx = pd.IndexSlice
df = pd.DataFrame({
('A', 'B'): [1, 2],
('A', 'C'): [3, 4],
('B', 'C'): [5, 6],
}, index=['X', 'Y'])
df.columns.names = ['first', 'second']
print("原始的DataFrame:")
print(df)
df.columns = df.columns.set_names(['one', 'two'])
print("替换后的DataFrame:")
print(df)
我们使用set_names方法来替换辅助索引的名称,重新设置了这个DataFrame的列名称。
结果输出:
原始的DataFrame:
first A B
second B C C
X 1 3 5
Y 2 4 6
替换后的DataFrame:
one A B
two B C C
X 1 3 5
Y 2 4 6
结论
本文介绍了如何使用Python的Pandas库的MultiIndex类来实现在DataFrame中创建列并替换索引级别名称。我们还演示了使用MultiIndex的级别创建DataFrame作为列的例子,并列出了几种创建MultiIndex的常用方法。最后,我们介绍了如何替换MultiIndex级别的名称。如果您想要更好地处理多级别索引的数据,Pandas是您应该了解和运用的工具之一。
极客笔记